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

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,270 @@
<?php
/**
* OrderActions - helper class to handle automatic actions from steps
*/
class OrderActions{
private $idAssignProcessStep = 2;
/**
* execute automated step
* @param INT $idOrder id for the order
* @param INT $idProcessStep id for the process step
* @return INT execution status; 1 for success and 0 for fail
*/
public function executeAutomatedStep($idOrder, $idProcessStep){
global $database;
$status = [];
$sql = "SELECT psa.actionCode, psa.stepType, ps.id as idProcessStep
FROM ".TABLES['process_step']." ps
INNER JOIN ".TABLES['process_step_actions']." psa
ON psa.id=ps.idActionCode
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.idStep=ps.id
WHERE rps.id=$idProcessStep
LIMIT 1";
$step = $database->fetchResultArray($sql);
if($step && count($step) > 0){
$status['actionExectution'] = $this->{ $step[0]['actionCode'] }($idOrder, $idProcessStep);
$childSteps = $this->getStepChilds($idProcessStep);
$status['updateCurrentStep'] = $this->updateActiveStep($idOrder, $idProcessStep, $childSteps);
foreach ($childSteps as $child) {
if($child['stepType'] === 'auto'){
return $this->executeAutomatedStep($idOrder, $child['idProcessStep']);
}else{
return $status['actionExectution'] > 0 && $status['updateCurrentStep'] > 0 ? 1 :0;
}
}
}else{
return 0;
}
}
/**
* update the status for the step in progress
* @param INT $idOrder id for the order
* @param INT $idProcessStep id for the process step
* @return INT affected rows
*/
public function updateActiveStep($idOrder, $idProcessStep, $childSteps){
global $database;
$sqlUpdateCurrentStep = "UPDATE ".TABLES['rel_order_process_step']."
SET status='done',
actualDate = IF(actualDate IS NULL, '".date("Y-m-d")."', actualDate)
WHERE idOrder=$idOrder
AND idProcessStep=$idProcessStep
";
$query = $database->query($sqlUpdateCurrentStep);
$status['current'] = $database->affectedRows();
$childValues = '';
if(count($childSteps) > 0){
foreach ($childSteps as $child) {
$childValues .= $child['idProcessStep'].',';
}
$childValues = rtrim($childValues, ',');
$sqlUpdateChilds = "UPDATE ".TABLES['rel_order_process_step']."
SET status='in-progress'
WHERE idOrder=$idOrder AND idProcessStep IN($childValues)";
$query = $database->query($sqlUpdateChilds);
$status['child'] = $database->affectedRows();
}else{
$status['child'] = 1;
}
return $status['current'] > 0 && $status['child'] > 0 ? 1 : 0;
}
/**
* remove a process from a package inan order
* @param INT $idOrder id for the order
* @return INT number of affected rows
*/
private function removeProcess($idOrder){
global $database;
$sql = "DELETE FROM ".TABLES['rel_order_process_step']."
WHERE idOrder=$idOrder";
$query = $database->query($sql);
$affectedRows = $database->affectedRows();
$sql = "UPDATE ".TABLES['rel_order_packages']."
SET status='no-process'
WHERE idOrder=$idOrder";
$query = $database->query($sql);
$affectedRows += $database->affectedRows();
$sql = "UPDATE ".TABLES['orders']."
SET status='open'
WHERE id=$idOrder";
$query = $database->query($sql);
$affectedRows += $database->affectedRows();
return $affectedRows;
}
/**
* undo an open step
* @param INT $idOrder id for the order
* @param INT $idProcessStep id for the process step
* @return INT 1 in case the step has benn undone and 0 in case of failure
*/
public function undoStep($idOrder, $idProcessStep){
global $database;
$database->beginTransaction();
$sqlUpdateCurrentStep = "
UPDATE ".TABLES['rel_order_process_step']."
SET status='inactive'
WHERE idOrder=$idOrder
AND idProcessStep=$idProcessStep
";
$query = $database->query($sqlUpdateCurrentStep);
$status['current'] = $database->affectedRows();
$sql = "SELECT parent.idStep
FROM ".TABLES['rel_process_steps']." parent
INNER JOIN ".TABLES['rel_process_steps']." current
ON current.idParent=parent.id
WHERE current.id=$idProcessStep";
$step = $database->fetchResultArray($sql)[0];
if(intval($step['idStep']) === $this->idAssignProcessStep){
$status['parent'] = $this->removeProcess($idOrder);
}else{
$sqlUpdateParent = "
UPDATE ".TABLES['rel_order_process_step']."
SET status='in-progress'
WHERE idOrder=$idOrder
AND idProcessStep=(SELECT idParent
FROM ".TABLES['rel_process_steps']."
WHERE id=$idProcessStep)";
$query = $database->query($sqlUpdateParent);
$status['parent'] = $database->affectedRows();
}
if($status['current'] < 1 && $status['parent'] < 1){
$database->rollback();
return 0;
}
$database->commit();
return 1;
}
/**
* get childs for a step
* @param INT $idProcessStep id for the process step
* @return Array Array with childs
*/
public function getStepChilds($idProcessStep){
global $database;
$sqlChilds = "SELECT rps.id AS idProcessStep,
psa.actionCode,
psa.stepType
FROM ".TABLES['rel_process_steps']." rps
INNER JOIN ".TABLES['process_step']." ps
ON ps.id=rps.idStep
INNER JOIN ".TABLES['process_step_actions']." psa
ON psa.id=ps.idActionCode
WHERE rps.idParent=$idProcessStep";
return $database->fetchResultArray($sqlChilds);
}
/**
* update the current step and activate childs (execute automated steps if they exist)
* @param INT $idOrder id for the order
* @param INT $idPackage id for the package
* @param INT $idProcessStep id for the process step
* @return Array number of update childs and executed automated steps
*/
public function updateChildSteps($idOrder, $idPackage, $idProcessStep){
global $database;
$childsUpdated = [
'manual' => 0,
'automated' => 0
];
$childSteps = $this->getStepChilds($idProcessStep);
if(!empty($childSteps)){
$childValues = '';
$automatedSteps = [];
foreach ($childSteps as $child) {
if($child['stepType'] === 'auto'){
$automatedSteps[] = $child;
}
$childValues .= $child['idProcessStep'].',';
}
$childValues = rtrim($childValues, ',');
$sqlUpdateChilds = "UPDATE ".TABLES['rel_order_process_step']."
SET status='in-progress'
WHERE idOrder=$idOrder AND idPackage=$idPackage AND idProcessStep IN($childValues)";
$query = $database->query($sqlUpdateChilds);
$childsUpdated['manual'] = $database->affectedRows();
foreach ($automatedSteps as $child) {
$childActionStatus = $this->{ $child['actionCode'] }($idOrder, $idPackage, $child['idProcessStep']);
if($childActionStatus){
$childsUpdated['automated'] = $this->updateActiveStep($idOrder, $child['idProcessStep']);
$automatedNewChilds = $this->updateChildSteps($idOrder, $idPackage, $child['idProcessStep']);
}
}
}
return $childsUpdated;
}
/**
* automatic action executed for Order Placed step
* @param INT $idOrder id of the order
* @param INT $idProcessStep id of the link of the step to the process
* @return boolean result for executing automated step
*/
public function newOrder($idOrder, $idProcessStep){
global $database;
$sql = "SELECT o.orderDate
FROM ".TABLES['orders']." o
WHERE id=$idOrder";
$order = $database->fetchResultArray($sql);
if(!isset($order[0])){
$order[0]['orderDate'] = date("Y-m-d");
}
$sql = "UPDATE ".TABLES['rel_order_process_step']."
SET estimateDate='".$order[0]['orderDate']."',
actualDate='".$order[0]['orderDate']."',
status='done'
WHERE idOrder=$idOrder AND idProcessStep=$idProcessStep";
$query = $database->query($sql);
return $database->affectedRows() === 1;
}
/**
* automatic action for assign process
* @param INT $idOrder id of the order
* @return boolean result for executing automated step
*/
public function processAssigned($idOrder){
global $database;
$sql = "UPDATE ".TABLES['rel_order_packages']."
SET status='processing'
WHERE idOrder=$idOrder";
$query = $database->query($sql);
return $database->affectedRows() > 0;
}
}
?>

View File

@@ -0,0 +1,237 @@
<?php
class OrderDocuments{
const DOCUMENT_TYPES = [
'ID_QUESTIONAIRE_DOC_TYPE' => 2, // 2 => 'orderQuestionaire'
'ID_CONFIGURATION_DOC_TYPE' => 3, // 3 => 'configuration'
'ID_ACCEPTANCE_DOC_TYPE' => 5, // 5 => 'customerAcceptance'
'ID_INSTALLATION_PROTOTCOL_DOC_TYPE' => 10 // 10 => 'installationProtocol'
];
private function getProductDocuments($idOrder){
global $database, $user;
$whreSql = "";
$data = [];
if($user->getUserType() !== USER_TYPES['BROKER']){
$whreSql = " AND visibleToCustomer=1";
}
$sql = "SELECT
d.id AS idDocument,
d.documentName,
d.documentPath,
d.extension,
dt.type AS documentType,
rpp.idPackage,
rpd.idProduct
FROM ".TABLES['rel_product_documents']." rpd
INNER JOIN ".TABLES['documents']." d
ON d.id=rpd.idDocument
INNER JOIN ".TABLES['document_types']." dt
ON dt.id=d.idDocumentType
INNER JOIN ".TABLES['rel_package_products']." rpp
ON rpp.idProduct=rpd.idProduct
INNER JOIN ".TABLES['rel_order_packages']." rop
ON rop.idPackage=rpp.idPackage AND rop.packageInstance=rpp.packageInstance
WHERE rop.idOrder=$idOrder $whreSql
";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data[$row['idPackage']][] = $row;
}
return $data;
}
/**
* get all docuemnts linked to an order
* @param INT $idOrder id for the order
* @return Array list of documetns for an order grouped by package id
*/
public function getOrderDocuments($idOrder){
global $database;
$data = [];
$sql = "SELECT
d.id AS idDocument,
d.documentName,
d.documentPath,
d.extension,
dt.type AS documentType,
IFNULL(rod.idPackage, 0) as idPackage
FROM ".TABLES['rel_order_documents']." rod
INNER JOIN ".TABLES['documents']." d
ON d.id=rod.idDocument
INNER JOIN ".TABLES['document_types']." dt
ON dt.id=d.idDocumentType
WHERE rod.idOrder=$idOrder
UNION all
SELECT
d.id AS idDocument,
d.documentName,
d.documentPath,
d.extension,
dt.type AS documentType,
rpd.idPackage
FROM ".TABLES['rel_package_documents']." rpd
INNER JOIN ".TABLES['rel_order_packages']." rop
ON rop.idPackage=rpd.idPackage
INNER JOIN ".TABLES['documents']." d
ON d.id=rpd.idDocument
INNER JOIN ".TABLES['document_types']." dt
ON dt.id=d.idDocumentType
WHERE rop.idOrder=$idOrder";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data[$row['idPackage']][] = $row;
}
$productDocuments = $this->getProductDocuments($idOrder);
if(!empty($productDocuments)){
foreach ($productDocuments as $idPackage => &$documents) {
if(isset($data[$idPackage])){
$data[$idPackage] = array_merge($data[$idPackage], $documents);
}else{
$data[$idPackage] = $documents;
}
}
}
return $data;
}
/**
* upload a new file for configuration
* @param INT $idOrder id for the order
* @param INT $idPackage id for the package
* @param INT $idSupplier id for supplier
* @param STRING $fileType the type of the file (configuration or installation)
* @param FILE $file file to be uploaded
* @return Array upload message
*/
public function uploadConfigurationDocument($idOrder, $idPackage, $idSupplier, $fileType, $file){
global $database, $user;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$idSupplier = $database->escapeValue($idSupplier);
$fileType = $database->escapeValue($fileType);
if(!$idPackage){
$data['messages'][] = [
'code' => 'error',
'message' => 'NO_PACKAGE'
];
return $data;
}
$idDocumentType = self::DOCUMENT_TYPES['ID_CONFIGURATION_DOC_TYPE'];
$nameSuffix = 'config';
$maxCount = 1;
$sql = "SELECT s.idUser
FROM ".TABLES['suppliers']." s
WHERE s.id=$idSupplier";
$query = $database->query($sql);
$supplier = $database->fetchArray($query);
$sql = "SELECT name
FROM ".TABLES['packages']."
WHERE id=$idPackage";
$query = $database->query($sql);
$package = $database->fetchArray($query);
$documentName = isset($package['name']) ? str_replace(' ', '_', $package['name']) : '';
$documentName .= '_'.$idSupplier.'_'.$nameSuffix;
$sql = "
SELECT
d.documentName
FROM
".TABLES['documents']." d
INNER JOIN ".TABLES['rel_order_documents']." rod
ON d.id = rod.idDocument
WHERE rod.idOrder = $idOrder
AND rod.idPackage = $idPackage
AND d.idDocumentType = $idDocumentType
ORDER BY d.id DESC
LIMIT 1";
$lastDocName = $database->fetchResultArray($sql);
if($lastDocName && $lastDocName[0]['documentName']) {
$count = explode('_', $lastDocName[0]['documentName']);
$maxCount = intval(end($count)) + 1;
}
$documentName .= '_'.$maxCount;
$idUser = $user->getUserId();
$fileManager = new FileManager();
$data = $fileManager->uploadFile($file, $idDocumentType, $documentName, $idUser, $supplier['idUser']);
if(isset($data['messages'])){
return $data;
}
$idDocument = $data['idDocument'];
$sql = "INSERT INTO ".TABLES['rel_order_documents']."
(idOrder, idPackage, idDocument, validation)
VALUES($idOrder, $idPackage, $idDocument, 'not-required')";
$query = $database->query($sql);
if($database->affectedRows() > 0){
$data['messages'][] = [
'code' => 'success',
'message' => 'FILE_UPLOADED'
];
}else{
$data['messages'][] = [
'code' => 'error',
'message' => 'NOT_UPLOADED'
];
}
return $data;
}
/**
* remove order document
* @param INT $idOrder id for order
* @param INT $idPackage id for package
* @param INT $idDocument id for document
* @return Array remove message
*/
public function removeOrderDocument($idOrder, $idPackage, $idDocument) {
global $database;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$idDocument = $database->escapeValue($idDocument);
$rowsDeleted = 0;
$data = [];
if(!$idDocument) {
$data['messages'][] = [
'code' => 'error',
'message' => 'DOCUMENT_NOT_SET'
];
return $data;
}
$fileManager = new FileManager();
$data = $fileManager->removeDocument($idDocument);
foreach ($data['messages'] as $messageObj) {
if ($messageObj['code'] === 'success') {
$sqlUnlink = "
DELETE
FROM ".TABLES['rel_order_documents']."
WHERE idOrder = $idOrder
AND idPackage = $idPackage
AND idDocument = $idDocument
";
$query = $database->query($sqlUnlink);
}
}
return $data;
}
}

View File

@@ -0,0 +1,544 @@
<?php
class orderExtraActions {
const DOCUMENT_TYPES = [
'ID_QUESTIONAIRE_DOC_TYPE' => 2, // 2 => 'orderQuestionaire'
'ID_CONFIGURATION_DOC_TYPE' => 3, // 3 => 'configuration'
'ID_ACCEPTANCE_DOC_TYPE' => 5, // 5 => 'customerAcceptance'
'ID_INSTALLATION_PROTOTCOL_DOC_TYPE' => 10 // 10 => 'installationProtocol'
];
const ID_INSTALLATION_CATEGORY = 2;
/**
* upload a new file for configuration
* @param INT $idOrder id for the order
* @param INT $idPackage id for the package
* @param INT $idSupplier id for supplier
* @param STRING $fileType the type of the file (configuration or installation)
* @param FILE $file file to be uploaded
* @return Array upload message
*/
public function uploadConfigurationDocument($idOrder, $idPackage, $idSupplier, $fileType, $file){
global $database, $user;
$idSupplier = $database->escapeValue($idSupplier);
$fileType = $database->escapeValue($fileType);
$idDocumentType = self::DOCUMENT_TYPES['ID_CONFIGURATION_DOC_TYPE'];
$nameSuffix = 'config';
$maxCount = 1;
if($fileType === 'installationProtocol') {
$idDocumentType = self::DOCUMENT_TYPES['ID_INSTALLATION_PROTOTCOL_DOC_TYPE'];
$nameSuffix = 'install_protocol';
}
$sql = "SELECT s.idUser
FROM ".TABLES['suppliers']." s
WHERE s.id=$idSupplier";
$query = $database->query($sql);
$supplier = $database->fetchArray($query);
$sql = "SELECT name
FROM ".TABLES['packages']."
WHERE id=$idPackage";
$query = $database->query($sql);
$package = $database->fetchArray($query);
$documentName = isset($package['name']) ? str_replace(' ', '_', $package['name']) : '';
$documentName .= '_'.$idSupplier.'_'.$nameSuffix;
$sql = "
SELECT
d.documentName
FROM
".TABLES['documents']." d
INNER JOIN ".TABLES['rel_order_documents']." rod
ON d.id = rod.idDocument
WHERE rod.idOrder = $idOrder
AND rod.idPackage = $idPackage
AND d.idDocumentType = $idDocumentType
ORDER BY d.id DESC
LIMIT 1";
$lastDocName = $database->fetchResultArray($sql);
if($lastDocName && $lastDocName[0]['documentName']) {
$count = explode('_', $lastDocName[0]['documentName']);
$maxCount = intval(end($count)) + 1;
}
$documentName .= '_'.$maxCount;
$fileManager = new FileManager();
$data = $fileManager->uploadFile($file, $idDocumentType, $documentName, $supplier['idUser']);
if(isset($data['messages'])){
return $data;
}
$idDocument = $data['idDocument'];
$sql = "INSERT INTO ".TABLES['rel_order_documents']."
(idOrder, idPackage, idDocument, validation)
VALUES($idOrder, $idPackage, $idDocument, 'not-required')";
$query = $database->query($sql);
if($database->affectedRows() > 0){
$data['messages'][] = [
'code' => 'success',
'message' => 'FILE_UPLOADED'
];
}else{
$data['messages'][] = [
'code' => 'error',
'message' => 'NOT_UPLOADED'
];
}
return $data;
}
/**
* get scheduled dates for a step
* @param INT $idOrder id for the order
* @param INT $idPackage id for the package
* @param INT $idProcessStep id for the process step
* @return Array array of schedueld dates
*/
public function getScheduledDates($idOrder, $idPackage, $idProcessStep){
global $database;
$data = [];
$confirmations = $this->getUserConfirmationsForSchedules($idOrder, $idPackage, $idProcessStep);
$sql = "SELECT rosd.id AS idSchedule,
rosd.scheduledDate,
rosd.isDateConfirmed,
rosd.idProcessStep,
rosd.idPackage
FROM ".TABLES['rel_order_scheduled_dates']." rosd
WHERE rosd.idOrder=$idOrder AND rosd.idPackage=$idPackage AND rosd.idProcessStep=$idProcessStep
ORDER BY rosd.scheduledDate ASC ";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$row['confirmations'] = isset($confirmations[$row['idSchedule']]) ? $confirmations[$row['idSchedule']] : [];
$data[] = $row;
}
return $data;
}
/**
* get user confirimations for the scheduled dates
* @param INT $idOrder id for the order
* @param INT $idPackage id for the pakage
* @param INT $idProcessStep id for the process step
* @return Array list of confirmations
*/
private function getUserConfirmationsForSchedules($idOrder, $idPackage, $idProcessStep){
global $database;
$data = [];
$sql = "SELECT rosc.idSchedule,
rosc.status,
u.username,
ut.type AS userType
FROM ".TABLES['rel_order_schedules_confirmations']." rosc
INNER JOIN ".TABLES['rel_order_scheduled_dates']." rosd
ON rosc.idSchedule=rosd.id
INNER JOIN ".TABLES['users']." u
ON u.id=rosc.idUser
INNER JOIN ".TABLES['rel_user_type']." rut
ON rut.idUser=u.id
INNER JOIN ".TABLES['user_types']." ut
ON ut.id=rut.idType
WHERE rosd.idOrder=$idOrder AND rosd.idPackage=$idPackage AND rosd.idProcessStep=$idProcessStep";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data[$row['idSchedule']][] = $row;
}
return $data;
}
/**
* add users that need to confirm the schedule date for installation
* @param INT $idOrder id for the order
* @param INT $idSchedule id for the schedule
*/
private function addRequiredConfrimationUsers($idOrder, $idSchedule){
global $database;
$sql = "INSERT INTO ".TABLES['rel_order_schedules_confirmations']."
(idSchedule, idUser, status)
SELECT $idSchedule AS idSchedule,
c.idUser AS idUser,
'pending' AS status
FROM ".TABLES['orders']." o
INNER JOIN ".TABLES['rel_commercial_lead_customers']." rclc
ON rclc.id=o.idCUstomerInstance
INNER JOIN ".TABLES['customers']." c
ON c.id=rclc.idCustomer
WHERE o.id=$idOrder";
$query = $database->query($sql);
return $database->affectedRows();
}
/**
* Update the estimation date for the follow up meeting from an order
* @param Int $idOrder Id of the order to be modified
* @param Int $idProcessStep id of the porcess to be modified
* @param String $estimationDate new date to be added for a follow up meeting
* @param String $confirmedDate confirmed date with the customer to be added for a follow up meeting
* @return array response message for the update
*/
public function updateScheduledDates($idOrder, $idPackage, $idProcess, $idProcessStep, $idSchedule, $newDate) {
global $database;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$idProcess = $database->escapeValue($idProcess);
$idProcessStep = $database->escapeValue($idProcessStep);
$idSchedule = $database->escapeValue($idSchedule);
$newDate = $database->escapeValue($newDate);
$orderDetailsParams = [
'idOrder' => $idOrder,
'idPackage' => $idPackage,
'idProcess' => $idProcess
];
$data = [];
if($newDate !== '') {
$checkDate = $database->invalidDate('INVALID_DATE_ESTIMATED', $newDate);
if($checkDate){
$data['messages'][] = $checkDate;
return $data;
}
$newDate = "'$newDate'";
} else {
$newDate = "null";
}
if(intval($idSchedule) === 0){
$database->beginTransaction();
$sql = "
INSERT INTO ".TABLES['rel_order_scheduled_dates']." (
idOrder,
idPackage,
idProcessStep,
scheduledDate,
isDateConfirmed
)
VALUES(
$idOrder,
$idPackage,
$idProcessStep,
$newDate,
0
)";
$query = $database->query($sql);
$newIdSchedule = $database->getInsertId();
$affectedRows = $database->affectedRows();
$affectedRows += $this->addRequiredConfrimationUsers($idOrder, $newIdSchedule);
if($affectedRows > 0){
$database->commit();
}else{
$database->rollback();
$err_mes = [
'code' => 'error',
'message' => 'SERVER_ERROR'
];
$data['messages'][] = $err_mes;
return $data;
}
}else{
$sql = "UPDATE ".TABLES['rel_order_scheduled_dates']."
SET scheduledDate=$newDate
WHERE id=$idSchedule";
$query = $database->query($sql);
$affectedRows = $database->affectedRows();
}
if(!$query){
$err_mes = [
'code' => 'error',
'message' => 'SERVER_ERROR'
];
$data['messages'][] = $err_mes;
}
if($affectedRows > 0){
$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'] : '';
/*if($estimationDate) {
$orderDetailsParams['estimatedMeetingDate'] = $estimationDate;
}
if($confirmedDate) {
$orderDetailsParams['confirmedMeetingDate'] = $confirmedDate;
}
$data['messages'][] = $this->sendConfirmationMail('scheduleMeeting', $orderDetailsParams);*/
$data['messages'][] = [
'code' => 'success',
'message' => 'ORDER_STEP_MEETING_DATE_UPDATED'
];
}
return $data;
}
/**
* update the status for an existing schedule date
* @param INT $idSchedule id for schedule date
* @param string $status new status for the schedule date
* @return Array update message
*/
public function updateScheduleDateStatus($idSchedule, $status, $idOrder, $idPackage, $actionCode){
global $database, $user;
$idSchedule = $database->escapeValue($idSchedule);
$data = [];
$sql = "UPDATE ".TABLES['rel_order_schedules_confirmations']."
SET status='$status'
WHERE idSchedule=$idSchedule AND idUser=".$user->getUserId();
$query = $database->query($sql);
if($database->affectedRows() > 0){
if($status === 'accepted' && $actionCode === 'choose-installation'){
$sql = "UPDATE ".TABLES['orders']."
SET acceptanceDueDate=DATE_ADD(
(SELECT scheduledDate
FROM ".TABLES['rel_order_scheduled_dates']."
WHERE id=$idSchedule),
INTERVAL 15 DAY)
WHERE id=$idOrder";
$query = $database->query($sql);
}
$updatedMainStatus = $this->updateScheduleGlobalStatus($idSchedule, $status);
$message = [
'code' => 'success',
'message' => 'SCHEDULE_STATUS_UPDATED'
];
$data['messages'][] = $message;
return $data;
}else{
$message = [
'code' => 'error',
'message' => 'SCHEDULE_STATUS_NOT_UPDATED'
];
$data['messages'][] = $message;
return $data;
}
}
/**
* update the status for the parent schedule date base on all users confirmation
* @param INT $idSchedule id for the scheduled date
* @param String $status new status addded to child
* @return INT number of affected rows
*/
private function updateScheduleGlobalStatus($idSchedule, $status){
global $database;
$confirmation = $status === 'accepted' ? 1 : -1;
$sql = "UPDATE ".TABLES['rel_order_scheduled_dates']."
SET isDateConfirmed=$confirmation
WHERE id=$idSchedule";
$query = $database->query($sql);
return $database->affectedRows();
}
/**
* get info for customer acceptance
* @param INT $idOrder id for the order
* @return Array custoemr acceptance info
*/
public function getCustomerAcceptance($idOrder){
global $database;
$idOrder = $database->escapeValue($idOrder);
$data = [];
$sql = "SELECT o.id AS idOrder,
o.customerAccepted,
IFNULL(o.customerDeclineReason, '') AS customerDeclineReason,
o.acceptanceDueDate
FROM ".TABLES['orders']." o
WHERE o.id=$idOrder";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$dueDate = new DateTime($row['acceptanceDueDate']);
$now = time();
$timeDiff = ($dueDate->getTimestamp() - $now ) / (3600 *24);
$row['daysDiff'] = $timeDiff;
$data[$row['idOrder']] = $row;
}
$sql = "SELECT
d.id AS idDocument,
d.documentName,
d.extension,
ro.idOrder
FROM ".TABLES['documents']." d
INNER JOIN ".TABLES['rel_order_documents']." ro
ON ro.idDocument=d.id
WHERE ro.idOrder=$idOrder AND d.idDocumentType=".self::DOCUMENT_TYPES['ID_ACCEPTANCE_DOC_TYPE'];
$query = $database->query($sql);
while($row = $database->fetchArray($query)) {
$data[$row['idOrder']]['acceptanceDocuments'][] = $row;
}
return $data;
}
/**
* upload customer acceptance document
* @param INT $idOrder id for the order
* @param INT $idPackage id for the packages
* @param FILE $file file to be uploaded
* @return Array upload status
*/
public function uploadAcceptanceDocument($idOrder, $idPackage, $file){
global $database, $user;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$fileManager = new FileManager();
$sql = "SELECT MAX(d.id)+1 AS maxIdDocument
FROM ".TABLES['documents']." d";
$maxId = $database->fetchResultArray($sql);
$maxIdDocument = $maxId && $maxId[0] && $maxId[0]['maxIdDocument'] ? $maxId[0]['maxIdDocument'] : 1;
$sql = "SELECT o.orderNumber
FROM orders o
WHERE id=$idOrder";
$query = $database->query($sql);
$row = $database->fetchArray($query);
$documentName = 'customerAcceptance_'.$row['orderNumber'].'_' . $maxIdDocument;
$uploadedBy = $user->getUserId();
$data = $fileManager->uploadFile($file, self::DOCUMENT_TYPES['ID_ACCEPTANCE_DOC_TYPE'], $documentName, $uploadedBy);
if(isset($data['messages'])){
return $data;
}
$idDocument = $data['idDocument'];
$sql = "INSERT INTO ".TABLES['rel_order_documents']."
(idOrder, idPackage, idDocument, validation)
VALUES($idOrder, $idPackage, $idDocument, 'not-validated')";
$query = $database->query($sql);
if($database->affectedRows() > 0){
$data['messages'][] = [
'code' => 'success',
'message' => 'FILE_UPLOADED'
];
}else{
$data['messages'][] = [
'code' => 'error',
'message' => 'NOT_LINKED_TO_ORDER'
];
}
return $data;
}
/**
* get customer questionaires for a specific order
* @param INT $idOrder id for the order
* @param INT $idPackage id for the pacakge
* @param String $documentType the type of the documents needed - Order Questionaire or Installation protocol
* @return Array array of documents
*/
public function getOrderDocumentsPerType($idOrder, $idPackage, $documentType){
global $database, $user;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$documentType = $database->escapeValue($documentType);
$whereSql = $idPackage ? "AND rod.idPackage=$idPackage" : "";
$data = [];
if($documentType === 'orderQuestionaire') {
$idDocumentType = self::DOCUMENT_TYPES['ID_QUESTIONAIRE_DOC_TYPE'];
} else if($documentType === 'installationProtocol') {
$idDocumentType = self::DOCUMENT_TYPES['ID_INSTALLATION_PROTOTCOL_DOC_TYPE'];
} else {
return [];
}
$sql = "SELECT d.id AS idDocument,
d.uploadedBy,
d.documentName,
d.extension,
rod.validation
FROM ".TABLES['documents']." d
INNER JOIN ".TABLES['rel_order_documents']." rod
ON rod.idDocument=d.id
WHERE d.idDocumentType=$idDocumentType
AND rod.idOrder=$idOrder
$whereSql";
$query = $database->query($sql);
while($row = $database->fetchArray($query)) {
$row['isUploadedByMe'] = $user->getUserId() === $row['uploadedBy'];
unset($row['uploadedBy']);
$data[] = $row;
}
return $data;
}
/**
* checks if the next step enables the installation scheduling function
* @param Int $idOrder id of the order
* @param Array $stepIds the ids of the steps from which the scheduling function is enabled
* @return Bool true if the nest step is the one searched
*/
public function checkIfIsNextStepWanted($idOrder, $stepIds) {
global $database;
$idOrder = $database->escapeValue($idOrder);
$stepIds = (array) json_decode($stepIds);
$firstStepEnabled = $database->escapeValue($stepIds['firstStepEnabled']);
$lastStepEnabled = $database->escapeValue($stepIds['lastStepEnabled']);
$sql = "
SELECT
ps.id
FROM
".TABLES['rel_order_process_step']." rops
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.id = rops.idProcessStep
INNER JOIN process_step ps
ON ps.id = rps.idStep
AND ps.idActionCode=$firstStepEnabled
WHERE rops.idOrder = $idOrder
AND rops.status = 'inactive'
UNION ALL
SELECT
ps.id
FROM
".TABLES['rel_order_process_step']." rops
INNER JOIN ".TABLES['rel_process_steps']." rps
ON rps.id = rops.idProcessStep
INNER JOIN ".TABLES['process_step']." ps
ON ps.id = rps.idStep
AND ps.idActionCode=$lastStepEnabled
WHERE rops.idOrder = $idOrder
AND (
rops.status = 'in-progress'
OR rops.status = 'done'
)";
$result = $database->query($sql);
return $database->numRows($result) > 0;
}
}

View File

@@ -0,0 +1,263 @@
<?php
class OrderHelper{
const DOCUMENT_TYPES = [
'ID_QUESTIONAIRE_DOC_TYPE' => 2, // 2 => 'orderQuestionaire'
'ID_CONFIGURATION_DOC_TYPE' => 3, // 3 => 'configuration'
'ID_ACCEPTANCE_DOC_TYPE' => 5, // 5 => 'customerAcceptance'
'ID_INSTALLATION_PROTOTCOL_DOC_TYPE' => 10 // 10 => 'installationProtocol'
];
/**
* get the orderNumber based on the order id
* @param Int $idOrder the id of the order
* @return Int the order number of that order
*/
public function getOrderNumberById($idOrder) {
global $database;
$sql = "
SELECT
o.orderNumber
FROM
".TABLES['orders']." o
WHERE o.id = $idOrder
LIMIT 1
";
$orderNumberArray = $database->fetchResultArray($sql);
if($orderNumberArray && $orderNumberArray[0]) {
return array_key_exists('orderNumber', $orderNumberArray[0]) ? $orderNumberArray[0]['orderNumber'] : '';
}
return '';
}
/**
* gets the name of the customer and commercial lead by order id
* @param Int $idOrder the id of the order
* @return Array the names of the customer and commercial lead from the given order
*/
public function getCustomerAndCLNamesFromOrder($idOrder) {
global $database;
$sql = "
SELECT
c.name AS customerName,
cl.name AS commercialLeadName
FROM
".TABLES['orders']." o
INNER JOIN ".TABLES['rel_commercial_lead_customers']." rclc
ON rclc.id = o.idCustomerInstance
INNER JOIN ".TABLES['customers']." c
ON c.id = rclc.idCustomer
INNER JOIN ".TABLES['commercial_leads']." cl
ON cl.id = rclc.idCommercialLead
WHERE o.id = $idOrder
LIMIT 1
";
$values = $database->fetchResultArray($sql);
return $values && $values[0] ? $values[0] : [];
}
/**
* returns the processId selected for a package in an order
* @param Int $idOrder id of the order
* @param Int $idPackage id of the package
* @return Int the id of the process selected
*/
public function getIdProcessSelectedForPackageOrder($idOrder, $idPackage) {
global $database;
if(!$idPackage) {
return 0;
}
$sql = "
SELECT
rps.idProcess
FROM
".TABLES['rel_process_steps']." rps
INNER JOIN ".TABLES['rel_order_process_step']." rops
ON rops.idProcessStep = rps.id
AND rops.idPackage = $idPackage
AND rops.idOrder = $idOrder
GROUP BY rps.idProcess
LIMIT 1
";
return $database->fetchResultArray($sql)[0]['idProcess'];
}
/**
* returns the mail addresses for cl and customer involved in the order process
* @param String $customerName customer's name
* @param String $commercialLeadName commercial lead's name
* @return Array mails of the customer and commercial lead
*/
public function getCLAndCustomerMails($customerName, $commercialLeadName, $isForComment = 0) {
global $database, $user;
$mailArray = [];
$sql = "
SELECT
c.idUser,
u.mail,
'customer' AS type
FROM
".TABLES['customers']." c
INNER JOIN ".TABLES['users']." u
ON u.id = c.idUser
WHERE c.name = '$customerName'
UNION
SELECT
cl.idUser,
u.mail,
'other' AS type
FROM
".TABLES['commercial_leads']." cl
INNER JOIN ".TABLES['users']." u
ON u.id = cl.idUser
WHERE cl.name = '$commercialLeadName'
";
$result = $database->query($sql);
while($row = $database->fetchArray($result)) {
if($row['mail'] !== '') {
if($isForComment) {
if($row['idUser'] != $user->getUserId()) {
$mailArray[$row['type']][] = $row['mail'];
}
} else {
$mailArray[$row['type']][] = $row['mail'];
}
}
}
return $mailArray;
}
/**
* check if user has rights to see a specific order
* @param INT $idOrder id of the order
* @return Boolean retruns true if the user can see the order
*/
public function checkOrderOwner($idOrder){
global $database, $user;
if($user->getUserType() === USER_TYPES['BROKER']){
return true;
}else if($user->getUserType() === USER_TYPES['CUSTOMER']){
$extraJoin = " INNER JOIN ".TABLES['rel_commercial_lead_customers']." rclc
ON rclc.id=o.idCustomerInstance
INNER JOIN ".TABLES['customers']." u
ON u.id=rclc.idCustomer";
}else if($user->getUserType() === USER_TYPES['COMMERCIAL_LEAD']){
$extraJoin = "INNER JOIN ".TABLES['rel_commercial_lead_customers']." rclc
ON rclc.id=o.idCustomerInstance
INNER JOIN ".TABLES['commercial_leads']." u
ON u.id=rclc.idCommercialLead";
}else if($user->getUserType() === USER_TYPES['SUPPLIER']){
$extraJoin = "INNER JOIN ".TABLES['rel_order_products_estimation']." rope
ON rope.idOrder=o.id
INNER JOIN ".TABLES['suppliers_countries_products']." scp
ON scp.idProduct=rope.idProduct
OR scp.idProductCategory = ".self::ID_INSTALLATION_CATEGORY."
INNER JOIN ".TABLES['suppliers']." u
ON u.id=scp.idSupplier";
}else{
return false;
}
$sql = "SELECT o.id
FROM ".TABLES['orders']." o
$extraJoin
WHERE u.idUser=".$user->getUserId()." AND o.id=$idOrder
LIMIT 1";
$query = $database->query($sql);
return $database->numRows($query) === 1;
}
/**
* upload document for an order
* @param Int $idOrder id of the order
* @param Int $idPackage id of the package
* @param Int $idFileType the id of the type of the file uploaded
* @param String $fileName the name of the file
* @param FILE $file file to be uploaded
* @return Array message with status
*/
public function uploadOrderDocument($idOrder, $idPackage, $idDocumentType, $documentName, $file){
global $database;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$idDocumentType = $database->escapeValue($idDocumentType);
$documentName = $database->escapeValue($documentName);
if(!$documentName){
$data['messages'][] = [
'code' => 'error',
'message' => 'NO_NAME'
];
return $data;
}
if(!$idDocumentType){
$data['messages'][] = [
'code' => 'error',
'message' => 'NO_TYPE'
];
return $data;
}
if(!$idPackage){
$data['messages'][] = [
'code' => 'error',
'message' => 'NO_PACKAGE'
];
return $data;
}
$sql = "SELECT d.id
FROM ".TABLES['documents']." d
WHERE d.documentName='$documentName'";
$query = $database->query($sql);
if($database->numRows($query) > 0){
$data['messages'][] = [
'code' => 'error',
'message' => 'NAME_EXISTS'
];
return $data;
}
$fileManager = new FileManager();
$data = $fileManager->uploadFile($file, $idDocumentType, $documentName);
if(isset($data['messages'])){
return $data;
}
if(array_search($idDocumentType, [self::DOCUMENT_TYPES['ID_CONFIGURATION_DOC_TYPE'], self::DOCUMENT_TYPES['ID_INSTALLATION_PROTOTCOL_DOC_TYPE']])) {
$docValidation = 'not-required';
} else {
$docValidation = 'not-validated';
}
$idDocument = $data['idDocument'];
$sql = "INSERT INTO ".TABLES['rel_order_documents']."
(idOrder, idPackage, idDocument, validation)
VALUES($idOrder, $idPackage, $idDocument, '$docValidation')";
$query = $database->query($sql);
$data['messages'][] = [
'code' => 'success',
'message' => 'DOCUMENT_UPLOADED'
];
return $data;
}
}

View File

@@ -0,0 +1,924 @@
<?php
class OrderProcessHelper {
/**
* insert new process step for order
* @param INT $idOrder id for order
* @param INT $idProcess id for process
* @return INT first step id or 0 on failure
*/
private function insertProcessStepsForOrder($idOrder, $idProcess){
global $database;
$sqlInsert = "INSERT IGNORE INTO ".TABLES['rel_order_process_step']."
(idProcessStep, idOrder, status)
VALUES ";
$sql = "SELECT rps.id AS idProcessStep,
rps.idParent,
$idOrder as idOrder,
CASE WHEN rps.idParent=0 THEN 'in-progress' ELSE 'inactive' END AS status
FROM ".TABLES['rel_process_steps']." rps
INNER JOIN
(
SELECT
rps_last.idProcess,
MAX(rps_last.processInstance) as lastInstace
FROM ".TABLES['rel_process_steps']." rps_last
WHERE rps_last.idProcess=$idProcess
GROUP BY rps_last.idProcess
) last_inst
ON last_inst.idProcess=rps.idProcess AND last_inst.lastInstace=rps.processInstance
INNER JOIN ".TABLES['process_step']." ps
ON ps.id=rps.idStep
WHERE rps.idProcess=$idProcess";
$query = $database->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'] ?
"<b>".$steps['currentStep']."</b> is currently in progress.<br />" :
'';
$params['prevStepMessage'] = $steps['prevStep'] ?
"The step <b>".$steps['prevStep']."</b> has been completed successfully.<br />" :
'';
break;
case 'lastStepCompleted':
$mailTitle = "Order $orderNumber is successfully completed ($currentDate)";
$lastStep = $this->getLastStepOrderCompleted($idProcess, $idOrder);
$params['prevStepMessage'] = $lastStep['prevStep']['isVisibleForCustomer'] === '1' ?
"The step <b>".$lastStep['prevStep']['description']."</b> has been done.<br />" :
'';
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 <b>".$orderData['estimatedDate']."</b>. <br />" :
'';
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 <b>".$orderData['estimatedMeetingDate']."</b>. <br />" :
'';
$params['confirmedDateMessage'] = array_key_exists('confirmedMeetingDate', $orderData) ?
"The confimed date set for the follow-up meeting is <b>".$orderData['confirmedMeetingDate']."</b>. <br />" :
'';
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 <b>".$orderData['estimatedDate']."</b>. <br />" :
'';
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] : [];
}
}

View File

@@ -0,0 +1,121 @@
<?php
class OrderTraking{
/**
* add tracking number and url for order/package/supplier
* @param INT $idOrder id for the order
* @param INT $idSupplier id for the supplier
* @param String $trackingNumber traking id
* @param String $trackingUrl traking url
* @return Array update message
*/
public function addTracking($idOrder, $idSupplier, $trackingNumber, $trackingUrl) {
global $database;
$idOrder = $database->escapeValue($idOrder);
$idSupplier = $database->escapeValue($idSupplier);
$trackingNumber = $database->escapeValue($trackingNumber);
$trackingUrl = $database->escapeValue($trackingUrl);
$data = [];
if (filter_var($trackingUrl, FILTER_VALIDATE_URL) === FALSE) {
$data['messages'][] = [
'code' => 'error',
'message' => 'INVALID_URL'
];
return $data;
}
$sql = "INSERT INTO ".TABLES['rel_order_supplier_options']." (
idOrder,
idSupplier,
trackingNumber,
trackingUrl
)
VALUES
($idOrder, $idSupplier, '$trackingNumber', '$trackingUrl')";
$query = $database->query($sql);
if($database->affectedRows() > 0){
$data['messages'][] = [
'code' => 'success',
'message' => 'TRAKING_ID_ADDED'
];
}else{
$data['messages'][] = [
'code' => 'warning',
'message' => 'NO_CHANGES'
];
}
return $data;
}
/**
* update dates for products in an order
* @param INT $idTracking id for the tracking info
* @param String $trackingNumber traking id
* @param String $trackingUrl traking url
* @return Array update message
*/
public function updateTracking($idTracking, $trackingNumber, $trackingUrl){
global $database;
$idTracking = $database->escapeValue($idTracking);
$trackingNumber = $database->escapeValue($trackingNumber);
$trackingUrl = $database->escapeValue($trackingUrl);
$data = [];
if (filter_var($trackingUrl, FILTER_VALIDATE_URL) === FALSE) {
$data['messages'][] = [
'code' => 'error',
'message' => 'INVALID_URL'
];
return $data;
}
$sql = "UPDATE ".TABLES['rel_order_supplier_options']."
SET trackingNumber='$trackingNumber',
trackingUrl='$trackingUrl'
WHERE id=$idTracking";
$query = $database->query($sql);
if($database->affectedRows() > 0){
$data['messages'][] = [
'code' => 'success',
'message' => 'TRAKING_ID_UPDATED'
];
}else{
$data['messages'][] = [
'code' => 'warning',
'message' => 'NO_CHANGES'
];
}
return $data;
}
public function removeTracking($idTracking) {
global $database;
$idTracking = $database->escapeValue($idTracking);
$data = [];
$sql = "DELETE FROM ".TABLES['rel_order_supplier_options']." WHERE id=$idTracking";
$result = $database->query($sql);
if($database->affectedRows()){
$data['messages'][] = [
'code' => 'success',
'message' => 'TRACKING_REMOVED'
];
} else {
$data['messages'][] = [
'code' => 'error',
'message' => 'TRACKING_REMOVED_ERROR'
];
}
return $data;
}
}

View File

@@ -0,0 +1,664 @@
<?php
/**
* OrdersController controls the actions for orders
*/
class OrdersController{
private $model;
function __construct(){
$this->model = new OrdersModel();
}
/**
* returns json array with table headers for orders
* @return list all columns headers
*/
public function getOngoingOrdersHeaders(){
echo json_encode($this->model->getOngoingOrdersHeaders('array'));
}
/**
* returns json response for orders
* @return list prders json
*/
public function getOngoingOrders(){
$data = ['data' => $this->model->getOngoingOrders()];
echo json_encode($data);
}
/**
* returns json array with table headers for orders history
* @return list all columns headers
*/
public function getOrdersHistoryHeaders(){
echo json_encode($this->model->getOrdersHistoryHeaders('array'));
}
/**
* returns json response for orders history
* @return list prders json
*/
public function getOrdersHistory(){
$data = ['data' => $this->model->getOrdersHistory()];
echo json_encode($data);
}
/**
* gets the info for an order
* @return [json] returns order info
*/
public function getOrderInfo() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
echo json_encode($this->model->getOrderInfo($idOrder));
}
/**
* returns json with steps for a specific order
* @return array order steps
*/
public function getOrderSteps() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
echo json_encode($this->model->getOrderSteps($idOrder));
}
/**
* change step for orders
* @return json result of the update
*/
public function goToNextStep() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idProcessStep = isset($_REQUEST['idProcessStep']) ? $_REQUEST['idProcessStep'] : 0;
$ordersDetailsMail = isset($_REQUEST['ordersDetailsMail']) ? $_REQUEST['ordersDetailsMail'] : '[]';
echo json_encode($this->model->goToNextStep($idOrder, $idProcessStep, $ordersDetailsMail));
}
/**
* undo step for orders
* @return json result of the update
*/
public function undoStep() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idProcessStep = isset($_REQUEST['idProcessStep']) ? $_REQUEST['idProcessStep'] : 0;
echo json_encode($this->model->undoStep($idOrder, $idProcessStep));
}
/**
* update the estimation for an order
* @return json json message for update result
*/
public function updateOrderEstimation() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$estimationDate = isset($_REQUEST['estimationDate']) ? $_REQUEST['estimationDate'] : '';
echo json_encode($this->model->updateOrderEstimation($idOrder, $estimationDate));
}
/**
* update the end of life date for a package and change order status if required
* @return json message for update result
*/
public function updatePackageEndOfLife(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$endOfLife = isset($_REQUEST['endOfLife']) ? $_REQUEST['endOfLife'] : '';
$ordersDetailsMail = isset($_REQUEST['ordersDetailsMail']) ? $_REQUEST['ordersDetailsMail'] : '[]';
echo json_encode($this->model->updatePackageEndOfLife($idOrder, $idPackage, $endOfLife, $ordersDetailsMail));
}
/**
* update the estimation for an order step
* @return json json message for update result
*/
public function updateScheduledDates() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$idProcess = isset($_REQUEST['idProcess']) ? $_REQUEST['idProcess'] : 0;
$idProcessStep = isset($_REQUEST['idProcessStep']) ? $_REQUEST['idProcessStep'] : 0;
$idSchedule = isset($_REQUEST['idSchedule']) ? $_REQUEST['idSchedule'] : 0;
$newDate = isset($_REQUEST['newDate']) ? $_REQUEST['newDate'] : '';
echo json_encode($this->model->updateScheduledDates($idOrder, $idPackage, $idProcess, $idProcessStep, $idSchedule, $newDate));
}
/**
* update the status for an existing schedule date
* @return json update message
*/
public function updateScheduleDateStatus(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$actionCode = isset($_REQUEST['actionCode']) ? $_REQUEST['actionCode'] : '';
$idSchedule = isset($_REQUEST['idSchedule']) ? $_REQUEST['idSchedule'] : 0;
$status = isset($_REQUEST['status']) ? $_REQUEST['status'] : '';
echo json_encode($this->model->updateScheduleDateStatus($idSchedule, $status, $idOrder, $idPackage, $actionCode));
}
/**
* get scheduled dates for a step
* @return json list of scheduled dates
*/
public function getScheduledDates(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$idProcessStep = isset($_REQUEST['idProcessStep']) ? $_REQUEST['idProcessStep'] : 0;
echo json_encode($this->model->getScheduledDates($idOrder, $idPackage, $idProcessStep));
}
/**
* update the actual date for an order step
* @return json message for update result
*/
public function updateStepActualDate() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idProcessStep = isset($_REQUEST['idProcessStep']) ? $_REQUEST['idProcessStep'] : 0;
$actualDate = isset($_REQUEST['actualDate']) ? $_REQUEST['actualDate'] : '';
$ordersDetailsMail = isset($_REQUEST['ordersDetailsMail']) ? $_REQUEST['ordersDetailsMail'] : '[]';
echo json_encode($this->model->updateStepActualDate($idOrder, $idProcessStep, $actualDate, $ordersDetailsMail));
}
/**
* update comment for an order
* @return json update message
*/
public function updateOrderComment() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$comment = isset($_REQUEST['comment']) ? $_REQUEST['comment'] : null;
$ordersDetailsMail = isset($_REQUEST['ordersDetailsMail']) ? $_REQUEST['ordersDetailsMail'] : '[]';
echo json_encode($this->model->updateOrderComment($idOrder, $comment, $ordersDetailsMail));
}
/**
* update commnets for an order
* @return json json message for update result
*/
public function updateStepComment() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idProcessStep = isset($_REQUEST['idProcessStep']) ? $_REQUEST['idProcessStep'] : 0;
$comment = isset($_REQUEST['comment']) ? $_REQUEST['comment'] : null;
$isVisible = isset($_REQUEST['isVisible']) ? intval($_REQUEST['isVisible']) : 0;
$ordersDetailsMail = isset($_REQUEST['ordersDetailsMail']) ? $_REQUEST['ordersDetailsMail'] : '[]';
echo json_encode($this->model->updateStepComment($idOrder, $idProcessStep, $comment, $isVisible, $ordersDetailsMail));
}
/**
* cancel one order
* @return json json message for cancel result
*/
public function cancelOrder() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$ordersDetailsMail = isset($_REQUEST['ordersDetailsMail']) ? $_REQUEST['ordersDetailsMail'] : '[]';
echo json_encode($this->model->cancelOrder($idOrder, $ordersDetailsMail));
}
/**
* set a selected process for an orders package
* @return json update message
*/
public function setProcessForOrder(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idProcess = isset($_REQUEST['idProcess']) ? $_REQUEST['idProcess'] : 0;
$ordersDetailsMail = isset($_REQUEST['ordersDetailsMail']) ? $_REQUEST['ordersDetailsMail'] : '[]';
echo json_encode($this->model->setProcessForOrder($idOrder, $idProcess, $ordersDetailsMail));
}
public function assignBroker(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idBroker = isset($_REQUEST['idBroker']) ? $_REQUEST['idBroker'] : 0;
echo json_encode($this->model->assignBroker($idOrder, $idBroker));
}
/**
* update visibility for a comment
* @return json update message
*/
public function updateStepCommentVisibility(){
$idComment = isset($_REQUEST['idComment']) ? $_REQUEST['idComment'] : 0;
$isVisible = isset($_REQUEST['isVisible']) ? intval($_REQUEST['isVisible']) : 0;
echo json_encode($this->model->updateStepCommentVisibility($idComment, $isVisible));
}
/**
* gets the system allowed languages from the DB
* @return json array with allowed languages in the system
*/
public function getSystemAllowedLanguages() {
echo json_encode($this->model->getSystemAllowedLanguages());
}
/**
* get brokers list
* @return json list of brokers
*/
public function getBrokers(){
echo json_encode($this->model->getBrokers());
}
/**
* update status for packages and orders in case of end of life
* @return text update message for statuses
*/
public function updateOrdersEndOfLife(){
echo $this->model->updateOrdersEndOfLife();
}
/**
* genereate file for procurement report
* @return file file for procurement report
*/
public function generateProcurementExcel(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$this->model->generateProcurementExcel($idOrder);
}
/**
* gets all thge installation companies for the order and package selected
* @return Array with the installation companies
*/
public function getInstallCompaniesForPackage() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
echo json_encode($this->model->getInstallCompaniesForPackage($idOrder, $idPackage));
}
/**
* save installation company for order and package
* @return Array with confirmation messages
*/
public function saveInstallationCompany() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$idInstallation = isset($_REQUEST['idInstallation']) ? $_REQUEST['idInstallation'] : 0;
echo json_encode($this->model->saveInstallationCompany($idOrder, $idPackage, $idInstallation));
}
/**
* get customer questionnaires documents
* @return json list of documents
*/
public function getOrderDocumentsPerType(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$documentType = isset($_REQUEST['documentType']) ? $_REQUEST['documentType'] : '';
echo json_encode($this->model->getOrderDocumentsPerType($idOrder, $idPackage, $documentType));
}
/**
* update status for a questionnaire
* @return json update message
*/
public function validateQuestionaire(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$idDocument = isset($_REQUEST['idDocument']) ? $_REQUEST['idDocument'] : 0;
$idProcessStep = isset($_REQUEST['idProcessStep']) ? $_REQUEST['idProcessStep'] : 0;
$validationStatus = isset($_REQUEST['validationStatus']) ? $_REQUEST['validationStatus'] : '';
$invalidQuestionaireReason = isset($_REQUEST['invalidQuestionaireReason']) ? $_REQUEST['invalidQuestionaireReason'] : '';
echo json_encode($this->model->validateQuestionaire($idOrder, $idPackage, $idDocument, $idProcessStep, $validationStatus, $invalidQuestionaireReason));
}
/**
* upload againa questionnaire
* @return json upload message
*/
public function reUploadQuestionaire(){
$file = isset($_FILES['file']) ? $_FILES['file'] : [];
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$idDocument = isset($_REQUEST['idDocument']) ? $_REQUEST['idDocument'] : 0;
echo json_encode($this->model->reUploadQuestionaire($idOrder, $idPackage, $idDocument, $file));
}
/**
* get estimation and confirmation dates for products
* @return json list of dates for products in procurement step
*/
public function getSupplierEstimations(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
echo json_encode($this->model->getSupplierEstimations($idOrder));
}
/**
* update date values for products in an order (procurement step)
* @return json update message
*/
public function updateSupplierEstimation(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idSupplier = isset($_REQUEST['idSupplier']) ? $_REQUEST['idSupplier'] : 0;
$estimatedDate = isset($_REQUEST['estimatedDate']) ? $_REQUEST['estimatedDate'] : '';
$confirmedDate = isset($_REQUEST['confirmedDate']) ? $_REQUEST['confirmedDate'] : '';
echo json_encode($this->model->updateSupplierEstimation($idOrder, $idSupplier, $estimatedDate, $confirmedDate));
}
/**
* remove estimation or confirm date
* @return json update message
*/
public function removeSupplierEstimation(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idSupplier = isset($_REQUEST['idSupplier']) ? $_REQUEST['idSupplier'] : 0;
$type = isset($_REQUEST['type']) ? $_REQUEST['type'] : '';
echo json_encode($this->model->removeSupplierEstimation($idOrder, $idSupplier, $type));
}
/**
* adds traking info
* @return json update message
*/
public function addTracking(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idSupplier = isset($_REQUEST['idSupplier']) ? $_REQUEST['idSupplier'] : 0;
$trackingNumber = isset($_REQUEST['trackingNumber']) ? $_REQUEST['trackingNumber'] : '';
$trackingUrl = isset($_REQUEST['trackingUrl']) ? $_REQUEST['trackingUrl'] : '';
echo json_encode($this->model->addTracking($idOrder, $idSupplier, $trackingNumber, $trackingUrl));
}
/**
* update traking id
* @return json update message
*/
public function updateTracking(){
$idTracking = isset($_REQUEST['idTracking']) ? $_REQUEST['idTracking'] : 0;
$trackingNumber = isset($_REQUEST['trackingNumber']) ? $_REQUEST['trackingNumber'] : '';
$trackingUrl = isset($_REQUEST['trackingUrl']) ? $_REQUEST['trackingUrl'] : '';
echo json_encode($this->model->updateTracking($idTracking, $trackingNumber, $trackingUrl));
}
/**
* delete traking information
* @return json update message
*/
public function removeTracking() {
$idTracking = isset($_REQUEST['idTracking']) ? $_REQUEST['idTracking'] : 0;
echo json_encode($this->model->removeTracking($idTracking));
}
/**
* upload required files for suppliers (configuration or installation)
* @return json upload message
*/
public function uploadConfigurationDocument(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$file = isset($_FILES['file']) ? $_FILES['file'] : [];
$idSupplier = isset($_REQUEST['idSupplier']) ? $_REQUEST['idSupplier'] : 0;
$fileType = isset($_REQUEST['fileType']) ? $_REQUEST['fileType'] : '';
echo json_encode($this->model->uploadConfigurationDocument($idOrder, $idPackage, $idSupplier, $fileType, $file));
}
/**
* upload required files for suppliers (configuration or installation)
* @return json upload message
*/
public function uploadInstallationDocument(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$file = isset($_FILES['file']) ? $_FILES['file'] : [];
$idSupplier = isset($_REQUEST['idSupplier']) ? $_REQUEST['idSupplier'] : 0;
$fileType = isset($_REQUEST['fileType']) ? $_REQUEST['fileType'] : '';
echo json_encode($this->model->uploadConfigurationDocument($idOrder, $idPackage, $idSupplier, $fileType, $file));
}
public function getInstallationDocuments() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
echo json_encode($this->model->getInstallationDocuments($idOrder, $idPackage));
}
public function getCustomerAcceptance(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
echo json_encode($this->model->getCustomerAcceptance($idOrder));
}
public function uploadAcceptanceDocument(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$file = isset($_FILES['file']) ? $_FILES['file'] : [];
echo json_encode($this->model->uploadAcceptanceDocument($idOrder, $idPackage, $file));
}
/**
* customer change acceptance status for a package
* @return Array message confirmation
*/
public function acceptDeclineInstallation(){
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$actionType = isset($_REQUEST['actionType']) ? $_REQUEST['actionType'] : '';
$declineReason = isset($_REQUEST['declineReason']) ? $_REQUEST['declineReason'] : '';
echo json_encode($this->model->acceptDeclineInstallation($idOrder, $idPackage, $actionType, $declineReason));
}
/**
* get availability if send support mail button is visible
* @return boolean value if send mail is available or not
*/
public function getAvailabilityForSendSupportMail() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
echo json_encode($this->model->getAvailabilityForSendSupportMail($idOrder));
}
/**
* sends a mail to the support team
* @return json confirmation message
*/
public function sendSupportMail() {
$ordersInfo = isset($_REQUEST['ordersInfo']) ? $_REQUEST['ordersInfo'] : '[]';
$orderPackages = isset($_REQUEST['orderPackages']) ? $_REQUEST['orderPackages'] : '[]';
$userText = isset($_REQUEST['userText']) ? $_REQUEST['userText'] : '';
echo json_encode($this->model->sendSupportMail($ordersInfo, $orderPackages, $userText));
}
/**
* returns the comments and the user id based on the comment type
* @return json array with comments
*/
public function getCommentsByType() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$idProcessStep = isset($_REQUEST['idProcessStep']) ? $_REQUEST['idProcessStep'] : 0;
$commentType = isset($_REQUEST['commentType']) ? $_REQUEST['commentType'] : '';
echo json_encode($this->model->getCommentsByType($idOrder, $idPackage, $idProcessStep, $commentType));
}
/**
* returns the suppliers for order
* @return json array with suppliers
*/
public function getSuppliersByPackageOrder() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$documentType = isset($_REQUEST['documentType']) ? $_REQUEST['documentType'] : '';
echo json_encode($this->model->getSuppliersByPackageOrder($idOrder, $idPackage, $documentType));
}
/**
* removes the document wanted
* @return json array with confirmation messages
*/
public function removeOrderDocument() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$idDocument = isset($_REQUEST['idDocument']) ? $_REQUEST['idDocument'] : 0;
echo json_encode($this->model->removeOrderDocument($idOrder, $idPackage, $idDocument));
}
/**
* sets the earliest installation
* @return json array with id order and package
*/
public function setEarliestInstallationDateInDb() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$maxDeliveryDate = isset($_REQUEST['maxDeliveryDate']) ? $_REQUEST['maxDeliveryDate'] : '';
echo json_encode($this->model->setEarliestInstallationDateInDb($idOrder, $idPackage, $maxDeliveryDate));
}
/**
* returns the earliest installation date based on the maximum delivery date plus the additional days
* @return json array with earliest installation date
*/
public function getEarliestInstallationDate() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
echo json_encode($this->model->getEarliestInstallationDate($idOrder, $idPackage));
}
/**
* returns the installation dates proposed/accepted/rejected by users
* @return json array with installation dates
*/
public function getInstallationDates() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
echo json_encode($this->model->getInstallationDates($idOrder, $idPackage));
}
public function checkIfDateAlreadyAccepted() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
echo json_encode($this->model->checkIfDateAlreadyAccepted($idOrder, $idPackage));
}
/**
* returns a message if the new date for the installation was successfully added
* @return json array with confirmation messages
*/
public function updateInstallationDate() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$installationDate = isset($_REQUEST['installationDate']) ? $_REQUEST['installationDate'] : '';
$status = isset($_REQUEST['status']) ? $_REQUEST['status'] : '';
echo json_encode($this->model->updateInstallationDate($idOrder, $idPackage, $installationDate, $status));
}
/**
* returns a message if the date was removed successfully
* @return json array with confirmation messages
*/
public function removeMyDate() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$installationDate = isset($_REQUEST['installationDate']) ? $_REQUEST['installationDate'] : '';
echo json_encode($this->model->removeMyDate($idOrder, $idPackage, $installationDate));
}
/**
* returns a bool value if it is the step we are searching for
* @return boolean value with confirmation if it's what we want
*/
public function checkIfIsNextStepWanted() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$stepIds = isset($_REQUEST['stepIds']) ? $_REQUEST['stepIds'] : '[]';
echo json_encode($this->model->checkIfIsNextStepWanted($idOrder, $stepIds));
}
/**
* upload a document for order and per package
* @return json array with update messages
*/
public function uploadOrderDocument() {
$idOrder = isset($_REQUEST['idOrder']) ? $_REQUEST['idOrder'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$idDocumentType = isset($_REQUEST['idDocumentType']) ? $_REQUEST['idDocumentType'] : 0;
$fileName = isset($_REQUEST['fileName']) ? $_REQUEST['fileName'] : '';
$file = isset($_FILES['file']) ? $_FILES['file'] : [];
echo json_encode($this->model->uploadOrderDocument($idOrder, $idPackage, $idDocumentType, $fileName, $file));
}
/**
* gives template for updating orders
* @return json json for orers updatemodel like for webshop
*/
public function updateOrdersJson(){
require_once('orders_update_template/orders_update_template.json');
}
/**
* include orders template
*/
public function ordersTemplate() {
global $user;
require_once('templates/OrdersTemplate.php');
}
/**
* include orders ongoing details template
*/
public function ordersDetailsTemplate() {
global $user;
require_once('templates/OrdersDetailsTemplate.php');
}
/**
* incldes template for orders steps
*/
public function changeOrdersStepsTemplate() {
global $user;
require_once('templates/ChangeOrdersStepsTemplate.php');
}
/**
* includes template for assign broker
*/
public function assignBrokerTemplate() {
require_once('templates/AssignBrokerTemplate.html');
}
/**
* includes template for components procurement extra action
*/
public function procurementTemplate() {
global $user;
require_once('templates/extra-actions/procurementTemplate.php');
}
/**
* includes template for choosing installation company extra action
*/
public function chooseInstallationTemplate() {
global $user;
require_once('templates/extra-actions/chooseInstallationTemplate.php');
}
/**
* includes template for scheduling follow up meeting extra action
*/
public function scheduleMeetingTemplate() {
global $user;
require_once('templates/extra-actions/scheduleMeetingTemplate.php');
}
/**
* includes template for validate questionnaire extra action
*/
public function validateQuestionnaireTemplate(){
global $user;
require_once('templates/extra-actions/validateQuestionnaireTemplate.php');
}
public function suppliersProcurementViewTemplate(){
global $user;
require_once('templates/SuppliersProcurementViewTemplate.php');
}
/**
* includes template for customer acceptance extra action
*/
public function customerAcceptanceTemplate(){
global $user;
require_once('templates/extra-actions/customerAcceptanceTemplate.php');
}
/**
* includes template for the email to the support team
*/
public function supportMailTemplate() {
require_once('templates/SupportMailTemplate.html');
}
/**
* open orders page
*/
public function showPage() {
require_once('OrdersPage.php');
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,22 @@
<script src="<?php echo PATH_JS_COMPONENTS.'orders/orders-details.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/orders.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/change-orders-steps.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/suppliers-procurement-view.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/assign-broker.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/support-mail.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/orders-utils.service.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/set-delivery-dates.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/installation-scheduler.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/upload-documents-for-order-package.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/extra-actions/procurement.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/extra-actions/choose-installation.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/extra-actions/validate-questionnaire.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/extra-actions/schedule-meeting.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orders/extra-actions/customer-acceptance.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orderProjects/order-projects.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'orderProjects/order-projects-edit.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<div id="orders-module" class="container-fluid col-md-12">
<h1>{{ 'orders.TITLE' | translate }}</h1>
<orders ng-controller="ordersController"></orders>
</div>

View File

@@ -0,0 +1,88 @@
<?php
class Procurement{
/**
* get documents grouped by suppliers
* @param INT $idOrder id for the order
* @param String $documentType the type of the document
* @return Array list of documents
*/
private function getSupplierDocuments($idOrder, $documentType = ''){
global $database;
$data = [];
$extraWhere = '';
if($documentType) {
$extraWhere = "
AND d.idDocumentType =
(SELECT
dt.id
FROM
document_types dt
WHERE dt.folderName = '$documentType')";
}
$sql = "SELECT d.id as idDocument,
d.documentName,
d.extension,
rod.idPackage,
s.name AS supplierName
FROM ".TABLES['documents']." d
INNER JOIN ".TABLES['rel_order_documents']." rod
ON rod.idDocument=d.id
INNER JOIN ".TABLES['suppliers']." s
ON s.idUser=d.idOwner
WHERE rod.idOrder=$idOrder $extraWhere";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data[$row['supplierName']][] = $row;
}
return $data;
}
/**
* get suppliers products
* @param INT $idOrder id for the order
* @param INT $idPackage id for the order
* @param String $documentType the type of the document
* @return Array Array of products estimations
*/
public function getSuppliersByPackageOrder($idOrder, $idPackage, $documentType){
global $database, $user;
$supplierBidsHandler = new SupplierBids();
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$documentType = $database->escapeValue($documentType);
$data = [];
$whereSql = "";
$documents = $this->getSupplierDocuments($idOrder, $documentType);
$supplierBids = $supplierBidsHandler->getOrderSupplierBids($idOrder);
if($user->getUserType() === USER_TYPES['SUPPLIER']){
$whereSql .= " AND s.idUser=".$user->getUserId();
}
if($idPackage != 0){
$whereSql .= " AND idPackage=$idPackage";
}
$sql = "SELECT s.id AS idSupplier,
s.name AS supplierName
FROM ".TABLES['rel_order_supplier_estimations']." rose
INNER JOIN ".TABLES['suppliers']." s
ON s.id=rose.idSupplier
WHERE idOrder=$idOrder $whereSql
ORDER BY s.id";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data[$row['supplierName']]['idSupplier'] = $row['idSupplier'];
$data[$row['supplierName']]['documents'] = isset($documents[$row['supplierName']]) ? $documents[$row['supplierName']] : [];
$data[$row['supplierName']]['supplierBids'] = isset($supplierBids[$row['idSupplier']]) ? $supplierBids[$row['idSupplier']] : [];
}
return $data;
}
}

View File

@@ -0,0 +1,258 @@
<?php
class SupplierEstimations{
private function getTrackingInfo($idOrder) {
global $database;
$data = [];
$sql = "
SELECT
roso.id AS idTracking,
roso.idSupplier,
roso.trackingNumber,
roso.trackingUrl
FROM
".TABLES['rel_order_supplier_options']." roso
WHERE roso.idOrder = $idOrder";
$query = $database->query($sql);
while($row = $database->fetchArray($query)) {
$data[$row['idSupplier']][] = $row;
}
return $data;
}
/**
* add null values for products estimations in an order
* @param INT $idOrder id of the order
*/
private function addStartEstimatisonForProducts($idOrder){
global $database;
$sql = "INSERT INTO ".TABLES['rel_order_supplier_estimations']."
(idOrder, idSupplier)
SELECT rop.idOrder, scp.idSupplier
FROM ".TABLES['rel_package_products']." rpp
INNER JOIN ".TABLES['rel_order_packages']." rop
ON rop.idPackage=rpp.idPackage AND rop.packageInstance=rpp.packageInstance
INNER JOIN ".TABLES['suppliers_countries_products']." scp
ON scp.idProduct=rpp.idProduct
WHERE rop.idOrder=$idOrder
GROUP BY rop.idOrder, scp.idSupplier";
$query = $database->query($sql);
return $database->affectedRows();
}
/**
* get estimations for products
* @param INT $idOrder id for the order
* @return Array Array of products estimations
*/
public function getSupplierEstimations($idOrder){
global $database, $user;
$idOrder = $database->escapeValue($idOrder);
$data = [];
$whereSql = "";
$trackingInfo = $this->getTrackingInfo($idOrder);
if($user->getUserType() === USER_TYPES['SUPPLIER']){
$whereSql = " AND s.idUser=".$user->getUserId();
}
$sql = "SELECT
rose.estimatedDate,
rose.confirmedDate,
s.id AS idSupplier,
s.name AS supplierName
FROM ".TABLES['rel_order_supplier_estimations']." rose
INNER JOIN ".TABLES['suppliers']." s
ON s.id=rose.idSupplier
WHERE idOrder=$idOrder $whereSql
ORDER BY s.id";
$query = $database->query($sql);
if($database->numRows($query) === 0){
if($user->getUserType() === USER_TYPES['SUPPLIER']) {
return $data;
}
$addedStartValues = $this->addStartEstimatisonForProducts($idOrder);
if($addedStartValues > 0){
return $this->getSupplierEstimations($idOrder);
}else{
return $data;
}
}
while($row = $database->fetchArray($query)){
$row['trackings'] = isset($trackingInfo[$row['idSupplier']]) ? $trackingInfo[$row['idSupplier']] : [];
$data[] = $row;
}
return $data;
}
private function isProductOwner($idSupplier){
global $user, $database;
if($user->getUserType() === USER_TYPES['BROKER']){
return true;
}else if($user->getUserType() === USER_TYPES['SUPPLIER']){
$sql = "SELECT s.id
FROM ".TABLES['suppliers']." s
WHERE s.id=$idSupplier AND s.idUser=".$user->getUserId();
$query = $database->query($sql);
return $database->numRows($query) > 0;
}
return false;
}
/**
* update dates for products in an order
* @param INT $idOrder id for the order
* @param INT $idSupplier od for the supplier
* @param String $estimatedDate estimated date
* @param String $confirmedDate confirmed date
* @return Array update message
*/
public function updateSupplierEstimation($idOrder, $idSupplier,$estimatedDate, $confirmedDate){
global $database;
$idOrder = $database->escapeValue($idOrder);
$idSupplier = $database->escapeValue($idSupplier);
$estimatedDate = $database->escapeValue($estimatedDate);
$confirmedDate = $database->escapeValue($confirmedDate);
$data = [];
if(!$this->isProductOwner($idSupplier)){
$data['messages'][] = [
'code' => 'error',
'message' => 'NOT_OWNER_OF_PROD'
];
return $data;
}
if(!$idOrder || !$idSupplier){
$data['messages'][] = [
'code' => 'error',
'message' => 'EST_MISSING_DATA'
];
return $data;
}
if(empty($estimatedDate) && empty($confirmedDate)){
$data['messages'][] = [
'code' => 'error',
'message' => 'EMPTY_DATES'
];
return $data;
}
$checkEstimatedDate = $database->invalidDate('INVALID_DATE_ESTIMATED', $estimatedDate);
$checkConfirmedDate = $database->invalidDate('INVALID_DATE_ESTIMATED', $confirmedDate);
if(($checkEstimatedDate && !empty($estimatedDate)) || ($checkConfirmedDate && !empty($confirmedDate))){
$data['messages'][] = $checkEstimatedDate ? $checkEstimatedDate : [];
$data['messages'][] = $checkConfirmedDate ? $checkConfirmedDate : [];
return $data;
}
if(empty($estimatedDate)){
$estimatedDate = $confirmedDate;
}
$estimatedDate = !empty($estimatedDate) ? "'$estimatedDate'" : "null";
$confirmedDate = !empty($confirmedDate) ? "'$confirmedDate'" : "null";
$sql = "UPDATE ".TABLES['rel_order_supplier_estimations']."
SET estimatedDate=$estimatedDate,
confirmedDate=$confirmedDate
WHERE idOrder=$idOrder AND idSupplier=$idSupplier";
$query = $database->query($sql);
if($database->affectedRows() > 0){
$data['messages'][] = [
'code' => 'success',
'message' => 'SUPPLIER_ESTIMATION_UPDATED'
];
$data['idSupplier'] = $idSupplier;
}else{
$data['messages'][] = [
'code' => 'warning',
'message' => 'NO_CHANGES'
];
}
return $data;
}
/**
* update dates for products in an order
* @param INT $idOrder id for the order
* @param INT $idSupplier id for the package
* @param String $type estiamtion or confirmation date
* @return Array update message
*/
public function removeSupplierEstimation($idOrder, $idSupplier, $type){
global $database;
$idOrder = $database->escapeValue($idOrder);
$idSupplier = $database->escapeValue($idSupplier);
$type = $database->escapeValue($type);
$data = [];
if(!$this->isProductOwner($idSupplier)){
$data['messages'][] = [
'code' => 'error',
'message' => 'NOT_OWNER_OF_PROD'
];
return $data;
}
if(!$idOrder || !$idSupplier){
$data['messages'][] = [
'code' => 'error',
'message' => 'EST_MISSING_DATA'
];
return $data;
}
if($type !== 'estimation' && $type !== 'confirmation'){
$data['messages'][] = [
'code' => 'error',
'message' => 'INVALID_ESTIMATION_TYPE'
];
return $data;
}
$fieldToUpdate = $type === 'estimation' ? "estimatedDate=NULL" : "confirmedDate=NULL";
$sql = "UPDATE ".TABLES['rel_order_supplier_estimations']."
SET $fieldToUpdate
WHERE idOrder=$idOrder AND idSupplier=$idSupplier";
$query = $database->query($sql);
if($database->affectedRows() > 0){
$data['messages'][] = [
'code' => 'success',
'message' => 'SUPPLIER_ESTIMATION_UPDATED'
];
}else{
$data['messages'][] = [
'code' => 'warning',
'message' => 'NO_CHANGES'
];
}
return $data;
}
}

View File

@@ -0,0 +1,47 @@
<div id="add-documents-to-order-container" ng-controller="uploadDocumentsForOrderPackageCtrl" ng-init="getDocumentTypes()">
<span ng-if="isOrderOngoingOrCompleted()" class="col-md-5 outside-process-steps">
<h3 class="upload-files-header">{{'orders.tables.headers.uploadFile' | translate}}</h3>
<hr />
<form id="upload-new-doc-container" name="form" class="row">
<div class="col-md-6">
<div class="document-types">
<label>{{'orders.headers.DOCUMENT_TYPES' | translate}}: </label>
<select id="document-types-for-order"
class="form-control-static add-document-value"
ng-model="docType"
ng-options="docType.type for docType in documentTypes track by docType.idDocumentType"
ng-change="selectFileType(docType)">
<option value="" disabled selected>{{'orders.headers.SELECT_DOCUMENT_TYPE' | translate}}</option>
</select>
</div>
<div class="document-types">
<label>{{'orders.headers.PACKAGES' | translate}}: </label>
<select id="document-packages-for-order"
class="form-control-static add-document-value"
ng-model="package"
ng-options="package.packageName for package in packages track by package.idPackage"
ng-change="selectPackage(package)">
<option value="" disabled selected>{{'orders.headers.SELECT_PACKAGE' | translate}}</option>
</select>
</div>
<div class="document-types">
<label>{{'orders.headers.DOCUMENT_NAME' | translate}}: </label>
<input id="new-doc-name"
class="add-document-value"
type="text"
placeholder="{{'orders.headers.DOCUMENT_NAME' | translate}}"
ng-model="$parent.fileName" />
</div>
</div>
<div class="col-md-6">
<div ngf-drop="uploadFile($file)"
ng-model="files"
ngf-drag-over-class="'dragover'"
ngf-select="uploadFile($file)"
ngf-pattern="'.pdf,.docx,.doc,.xlsx,.xls,.odt,.ods,.png,.jpg,.jpeg'"
ngf-max-size="20MB"
class="drop-box">{{'orders.headers.SELECT_DOCUMENT' | translate}}</div>
</div>
</form>
</span>
</div>

View File

@@ -0,0 +1,9 @@
<div ng-if="isOrderOngoing(ordersInfo.status)" id="assign-broker-parent" class="col-md-2">
<label class="order-label">{{'orders.tables.headers.assignedTo' | translate}}</label>
<div class="order-box">
<div class="assign-broker-layer" id-order="{{ordersInfo.id}}">
<div class="assigned-broker">{{ordersInfo.assignedTo}}</div>
<div id="enalbe-assign-edit" ng-init="enableAssignBrokerEdit()" class="assign-icon glyphicon glyphicon-pencil"></div>
</div>
</div>
</div>

View File

@@ -0,0 +1,12 @@
<div class="assign-combobox-layer">
<input id="selected-broker" ng-model="selectedBroker" list="brokers">
<datalist id="brokers">
<option ng-repeat="broker in brokers" value="{{broker.brokerName}}">
</datalist>
<div class="assign-buttons">
<div ng-click="assignBroker()" class="assign-btn glyphicon glyphicon-ok"></div>
<div ng-click="removeAssign()" class="assign-btn glyphicon glyphicon-remove"></div>
</div>
</div>

View File

@@ -0,0 +1,21 @@
<div class="col-md-12">
<div
id="order-cancel"
ng-if="isOrderOngoing(ordersInfo.status)"
class="btn btn-danger"
ng-click="showHideCancelDialog()">
{{'orders.buttons.CANCEL_ORDER' | translate}}
</div>
<div id="dialog-confirm"
dialog
ng-if="isCancelDialogVisible"
on-confirmation="cancelOrder"
on-close="showHideCancelDialog"
is-modal="true"
has-buttons="true"
parameters="ordersInfo.id"
title="{{'orders.headers.CANCEL_ORDER' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.ORDER_CANCEL_CONFIRMATION' | translate}} {{ordersInfo.id}}?</p>
</div>
</div>

View File

@@ -0,0 +1,8 @@
<div id="delivery-date-layer" ng-if="isOrderOngoing(ordersInfo.status)">
<div class="order-label">{{'orders.tables.headers.estimatedDeliveryDate' | translate}}: </div>
<input
ng-model="ordersInfo.estimatedDeliveryDate"
on-date-selected="updateOrderEstimation"
datepicker
id="order-etimated-delivery-date"/>
</div>

View File

@@ -0,0 +1,5 @@
<button type="button"
id="change-orders-steps-btn"
subModule="orders_steps"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'orders.buttons.CHANGE_ORDERS_STEPS' | translate }}</button>

View File

@@ -0,0 +1,299 @@
<div id="change-order-steps-message" ng-if="!isMyOrder(ordersInfo)">
<div class="alert alert-warning">
{{ 'orders.messages.NO_RIGHTS_FOR_ORDER' | translate }}
</div>
</div>
<div id="change-orders-steps-layer" ng-if="isMyOrder(ordersInfo)">
<div id="order-info" class="order-info col-md-12">
<h3>
{{ 'orders.headers.CHANGE_ORDERS_STEPS' | translate }}
{{'orders.headers.STEP_ORDER' | translate}} {{ordersInfo.orderNumber}} {{'orders.headers.STEP_ORDER_FROM' | translate}} {{ordersInfo.orderDate}}
<div class="step-order-status order-status-{{ordersInfo.status}}"><span class="{{getOrderStatusIcon(ordersInfo.status)}}"></span>{{getStatusText(ordersInfo.status)}}</div>
<span class="order-info-toggle glyphicon glyphicon-plus-sign" ng-click="toggleInfo($event)"></span>
</h3>
<div id="order-info-description" class="col-md-12 order-description order-toggle-info">
<div class="col-md-4">
<div id="order-info-all" class="col-md-6 order-info-container">
<div class="order-big-label">{{'orders.tables.headers.generalInfo' | translate}}:</div>
<div ng-if="ordersInfo.estimatedDeliveryDate" class="order-info-box">
<div class="order-label">{{'orders.tables.headers.estimatedDeliveryDate' | translate}}: </div>
<div class="order-estimated order-text">{{ordersInfo.estimatedDeliveryDate}}</div>
</div>
<div class="order-info-box">
<div class="order-label">{{'orders.tables.headers.reference' | translate}}: </div>
<div class="order-reference order-text">{{ordersInfo.reference}}</div>
</div>
<div class="order-info-box">
<div class="order-label">{{'orders.tables.headers.tender' | translate}}: </div>
<div class="order-tender order-text">{{ordersInfo.tender}}</div>
</div>
<div class="order-info-box">
<div class="order-label">{{'orders.tables.headers.soldBy' | translate}}: </div>
<div class="order-cl order-text">{{ordersInfo.commercialLead}}</div>
</div>
</div>
<div id="order-info-customer" class="col-md-6 order-info-container">
<div class="order-big-label">{{'orders.tables.headers.customer' | translate}}:</div>
<div class="order-info-box">
<div class="order-customer-info order-text">
<span class="order-icon glyphicon glyphicon-user"></span>
{{ordersInfo.customer}}
</div>
</div>
<div class="order-info-box">
<div class="order-customer-info order-text">
<span class="order-icon glyphicon glyphicon-earphone"></span>
{{ordersInfo.phone}}
</div>
</div>
<div class="order-info-box">
<div class="order-customer-info order-text">
<span class="order-icon glyphicon glyphicon-envelope"></span>
{{ordersInfo.mail}}
</div>
</div>
</div>
<div ng-if="orderDocuments[0]" id="order-other-documents" class="col-md-12">
<br/>
<div class="order-big-label">Other documents:</div>
<div class="order-document" ng-repeat="document in orderDocuments[0]">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
<span class="glyphicon glyphicon-file"></span> {{document.documentName}}.{{document.extension}} ({{document.documentType}})
</a>
</div>
</div>
</div>
<div id="order-info-items" class="order-info-all-items col-md-6">
<div class="order-big-label">{{'orders.tables.headers.orderItems' | translate}}:</div>
<div id="order-package-info-{{package.idPackage}}" class="order-info-item" ng-repeat="package in packages">
<div class="order-info-item-name">{{package.units}} x {{package.packageName}}</div>
<div class="order-info-item-info">
<div class="order-info-box">
<div class="order-label">{{'orders.tables.headers.price' | translate}}:</div>
<div class="order-text">
{{calculatePrice([package.packageFixedPrice], package.units)}}
( {{calculatePrice([package.packageRecuringPrice, package.packageServicePrice], package.units)}} / {{package.periodUnit}} )
</div>
<div class="prices-info alert-info">
<div class="glyphicon glyphicon-info-sign"></div>
<div class="order-text">
<span ng-if="package.packagePayPeriod > 0">
{{'orders.tables.extra.PACKAGE_RECURENT' | translate}}
{{package.units}} x {{package.packageRecuringPrice}} / {{package.periodUnit}}
{{'orders.tables.extra.FOR' | translate}} {{package.packagePayPeriod}} {{package.periodUnit}}
</span>
</div>
<div class="order-text">
{{'orders.tables.extra.SERVICE_AND_SUPPORT' | translate}}
{{package.units}} x {{package.packageServicePrice}} / {{package.periodUnit}}
<span ng-if="package.servicesContractPeriod > 0">{{'orders.tables.extra.FOR' | translate}} {{package.servicesContractPeriod}} {{package.periodUnit}}</span>
{{'orders.tables.extra.EXTEND' | translate}} {{package.periodUnit}} (Max {{package.maxContractPeriod}})
</div>
</div>
</div>
<div class="order-info-box" ng-if="orderOptions[package.idPackage]">
<div class="order-label">{{'orders.headers.OPTIONS' | translate}}:</div>
<div class="order-text">
<div class="order-option" ng-repeat="option in orderOptions[package.idPackage]">
<div>
{{option.groupName}} : {{option.packageName}}
</div>
</div>
</div>
</div>
<div class="order-info-box" ng-if="additionalPackages[package.idPackage]">
<div class="order-label">{{'orders.headers.ADDIITONAL_PACKAGES' | translate}}:</div>
<div class="order-text">
<div class="order-option" ng-repeat="additionalPackage in additionalPackages[package.idPackage]">
<div>
{{additionalPackage.packageName}}
</div>
</div>
</div>
</div>
<div class="order-info-box">
<div class="order-label">{{'orders.tables.headers.documents' | translate}}:</div>
<div class="order-document" ng-repeat="document in orderDocuments[package.idPackage]">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
<span class="glyphicon glyphicon-file"></span> {{document.documentName}}.{{document.extension}} ({{document.documentType}})
</a>
</div>
</div>
<div class="order-info-box">
<div class="order-label">{{'orders.tables.headers.products' | translate}}:</div>
<div class="order-product-category" ng-repeat="(category, categoryProducts) in products[package.idPackage]">
<span class="order-category">{{category}}:</span>
<div ng-if="selections[package.idPackage][category]" class="selected-category">
<span class="selected-product" ng-repeat="categSelection in selections[package.idPackage][category]">
{{categSelection.productName}} <span class="my-selection">(selected)</span>,
</span>
</div>
<div ng-if="!selections[package.idPackage][category]" class="containing-products">
<span ng-repeat="product in categoryProducts">
{{product.productName}},
</span>
</div>
</div>
</div>
<div ng-if="hasAgreement(package.packagePayPeriod, package.servicesContractPeriod)" class="order-info-box">
<div class="order-label">{{'orders.tables.headers.agreement' | translate}}</div>
<div class="order-info-box" ng-if="package.packagePayPeriod > 0">
{{'orders.tables.extra.PACKAGE_AGREEMENT' | translate}}
{{package.packagePayPeriod}} {{package.periodUnit}}
</div>
<div class="order-info-box" ng-if="package.servicesContractPeriod > 0">
{{'orders.tables.extra.SERVICES_AGREEMENT' | translate}}
{{package.servicesContractPeriod}} {{package.periodUnit}}
</div>
</div>
</div>
<div class="order-info-item-status order-status-{{package.status}}">
<span class="{{getOrderStatusIcon(package.status)}}"></span>
</div>
</div>
</div>
<div class="terms-layer col-md-12">
<a target="_blank" href="terms/html/pdfTerms">{{'orders.headers.TERMS' | translate}}</a>
</div>
</div>
<div id="order-estimated-delivery-date" class="col-md-2">
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('ChangeOrderEstimationDate.html');
}else{
require_once('OrderEstimationDate.html');
}
?>
</div>
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('AssignBrokerLayer.html');
require_once('CancelOrderButton.html');
}
?>
</div>
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('SetProcessForPackage.html');
} else {
require_once('ShowPackageUnassignedProcess.html');
}
?>
<div id="package-layer-{{process.idProcess}}" class="package-steps col-md-10" ng-repeat="process in processSteps">
<div class="col-md-6">
<h4>{{process.processName}}</h4>
<div class="order-steps-layer">
<div ng-if="isStepVisible(position, process.steps, process)" class="order-step-layer" ng-repeat="(position, step) in process.steps">
<div ng-if="hasMoreSteps(position, process.steps, process, 'start')" class="col-md-12 order-seps-more">
<div class="more-steps-start order-seps-more-icon glyphicon glyphicon-option-horizontal"></div>
<div class="ordere-step-show-all-icon glyphicon glyphicon-plus-sign" ng-click="showAllSteps(process)"></div>
</div>
<div class="col-md-12">
<div class="order-step-link"></div>
</div>
<div id-step="{{step.idProcessStep}}" class="col-md-10 order-step {{getStatusClass(step.status)}}">
<div class="order-step-number">
<div>{{position + 1}}</div>
<div class="glyphicon {{stepVisibleForCustomer(step.isVisibleForCustomer)}}"></div>
</div>
<div class="order-step-info">
<div class="order-step-description">
{{step.shortDesc}}
<div class="order-step-status-text">
{{'orders.statuses.' + formatStepText(step.status) | translate}}
</div>
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('OrderStepFullDescriptionButton.html');
}
?>
</div>
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('OrdersStepEditInfo.html');
}else{
require_once('OrdersStepInfo.html');
}
?>
<div ng-if="hasExtraAction(step)" class="step-extra-action">
<div id="extra-action-{{step.idProcess}}" class="extra-action-layer" ng-init="extraActionDirective(step)"></div>
</div>
</div>
</div>
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('GoToNextStepButton.html');
}
?>
<div ng-if="hasMoreSteps(position, process.steps, process, 'end')" class="col-md-12 order-seps-more">
<div class="order-seps-more-icon glyphicon glyphicon-option-horizontal"></div>
<div class="more-steps-end ordere-step-show-all-icon glyphicon glyphicon-plus-sign" ng-click="showAllSteps(process)"></div>
</div>
<div ng-if="isExpandedAndFirstStepInactive(process, step, position)" class="col-md-12 ordere-step-show-all-icon hide-steps glyphicon glyphicon-minus-sign" ng-click="showAllSteps(process)"></div>
</div>
<div ng-if="isExpanded(process)" class="col-md-12 ordere-step-show-all-icon hide-steps glyphicon glyphicon-minus-sign" ng-click="showAllSteps(process)"></div>
</div>
</div>
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('AddDocumentsToOrderLayer.html');
require_once('SetDeliveryDatesTemplate.php');
require_once('InstallationSchedulerBrokerTemplate.php');
} else if($user->getUserType() === USER_TYPES['COMMERCIAL_LEAD']){
require_once('ShowDeliveryDatesCLTemplate.php');
} else if($user->getUserType() === USER_TYPES['CUSTOMER']){
require_once('InstallationSchedulerCustomerTemplate.php');
}
?>
</div>
<div id="order-comments" class="col-md-6">
<div class="order-comments row">
<h4 class="col-md-12">{{'orders.headers.ORDER_COMMENTS' | translate}}</h4>
<div class="alert alert-info col-md-12">
<span class="glyphicon glyphicon-exclamation-sign"></span>
<span>{{allowedLanguagesDescription}}</span>
</div>
<div class="order-step-comments-container" class="col-md-12">
<div id="order-comment-textarea" class="order-step-comment-textarea ">
<textarea
ui-tinymce="tinymceOptions"
ng-model="ordersInfo.orderCommentText"></textarea>
</div>
<div id="add-order-comment" class="add-order-comment btn btn-primary col-md-4" ng-click="updateOrderComment()">
{{ 'orders.buttons.SUBMIT' | translate }}
</div>
</div>
<div class="order-added-comments" class="col-md-12">
<div class="order-comment-layer" ng-repeat="commentObj in orderComments">
<div class="order-comment-date">
{{commentObj.username}} - {{commentObj.addDate}}
</div>
<div class="order-comment-label" ng-bind-html="renderHtml(commentObj.comment)"></div>
</div>
</div>
<div id="send-support-mail-btn" ng-if="isSendSupportMailBtnAvailable">
<div class="send-support-mail btn btn-info col-md-4" ng-click="showHideSupportDialog()">
{{ 'orders.buttons.SUPPORT_MAIL' | translate }}
</div>
<div id="send-mail-to-support-dialog"
dialog
ng-if="isSupportMailBtnVisible"
on-confirmation="sendSupportMail"
on-close="showHideSupportDialog"
is-modal="true"
has-buttons="true"
parameters="supportMailText"
buttons-names="supportBtnNames"
title="{{'orders.buttons.SUPPORT_MAIL' | translate}}">
<p>
<div support-mail
orders-details="ordersInfo"
packages="packages"
support-mail-text="supportMailText">
</div>
</p>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,6 @@
<div class="row">
<div class="earliest-installation-date-layer col-md-12">
<div class="col-md-5">{{'orders.headers.EARLIEST_INSTALLATION_DATE' | translate}}:</div>
<div class="col-md-4">{{earliestInstallationDate()}}</div>
</div>
</div>

View File

@@ -0,0 +1,42 @@
<div class="col-md-2">
<div id="undo-step-{{step.idOrder}}-{{step.idProcess}}"
ng-if="isNextButtonVisible(step.status)"
class="order-step-next btn btn-info"
ng-click="showHideNextDialog({idProcess: process.idProcess, action: 'undo'})">
{{'orders.buttons.UNDO_STEP' | translate}}
<div id="dialog-undo-confirm-{{process.idProcess}}"
dialog
ng-if="isUndoDialogVisible[process.idProcess]"
on-confirmation="undoStep"
on-close="showHideNextDialog"
is-modal="true"
has-buttons="true"
parameters="{idOrder: ordersInfo.id, idProcessStep: step.idProcessStep, idProcess: step.idProcess, action: 'undo'}"
title="{{'orders.headers.UNDO_STEP_CONFIRMATION' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.UNDO_STEP_CONFIRMATION' | translate}}?</p>
</div>
</div>
<div id="go-to-next-step-{{step.idOrder}}-{{step.idProcess}}"
ng-disabled="isExtraActionOpen[step.idOrder+'-'+step.idProcess]"
ng-if="isNextButtonVisible(step.status)"
class="order-step-next btn btn-success"
ng-click="showHideNextDialog({idOrder: ordersInfo.id, idProcessStep: step.idProcessStep, idProcess: step.idProcess, action: 'next'})">
{{'orders.buttons.NEXT_STEP' | translate}}
<div id="dialog-next-confirm-{{process.idProcess}}"
dialog
ng-if="isNextDialogVisible[process.idProcess]"
on-confirmation="goToNextStep"
on-close="showHideNextDialog"
is-modal="true"
has-buttons="true"
parameters="{idOrder: ordersInfo.id, idProcessStep: step.idProcessStep, idProcess: step.idProcess, action: 'next'}"
title="{{'orders.headers.NEXT_STEP_CONFIRMATION' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.NEXT_STEP_CONFIRMATION' | translate}}?</p>
</div>
</div>
</div>

View File

@@ -0,0 +1,105 @@
<div class="col-md-6" ng-repeat="orderPackage in packages">
<div id="installation-scheduler-container" ng-controller="installationSchedulerCtrl" ng-init="getInstallationDetails()">
<div ng-if="isInstallationInOrder" class="col-md-12 outside-process-steps">
<h3 class="additional-procurement-header">{{'orders.headers.INSTALLATION_SCHEDULING' | translate}} {{orderPackage.packageName}}</h3>
<hr />
<fieldset ng-disabled="isInstallationSchedulingDisabled()" class="show-installation-dates">
<div class="choose-installation-layer row" ng-if="!isChangeInstallationAvailable">
<div class="col-md-12" ng-if="multipleInstallCompanies">
<label class="col-md-5">{{'orders.tables.extra.CHOOSE_INSTALLATION' | translate}}</label>
<select id="installation-companies-group"
class="form-control-static {{optionClass}} col-md-4"
ng-model="installationCompany"
ng-options="installCompany.name for installCompany in installCompanies track by installCompany.id"
ng-change="showHideInstallationDialog(installationCompany.id)">
</select>
<div id="confirm-change-installation-company"
dialog
ng-if="isInstallationDialogVisible[installationCompany.id]"
on-confirmation="saveInstallationForPackage"
on-close="showHideInstallationDialog"
is-modal="true"
has-buttons="true"
parameters="installationCompany.id"
title="{{'orders.headers.CHANGE_INSTALLATION_COMPANY' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.CHANGE_INSTALLATION_COMPANY_CONFIRM' | translate}}: <b>{{installationCompany.name}}</b>?</p>
</div>
</div>
<div class="col-md-12" ng-if="!multipleInstallCompanies">
<label class="col-md-5">{{'orders.tables.extra.INSTALLATION_COMPANY' | translate}}:</label>
{{installationCompany.name}}
</div>
</div>
<div ng-if="isChangeInstallationAvailable" class="row">
<div class="col-md-12">
<label class="col-md-5">{{'orders.tables.extra.INSTALLATION_COMPANY_SELECTED' | translate}}:</label>
<span class="col-md-7">{{installationCompany.name}}</span>
</div>
</div>
<?php
require('DisplayEarliestInstallationDate.html');
?>
</fieldset>
<fieldset ng-disabled="isInstallCompanySelectedAndScheduleDisabled()" class="set-installation-dates">
<div id="propose-installation-dates" class="row">
<?php
require('InstallationSchedulingDatesTemplate.html');
?>
<div id="installation-files-container" class="col-md-12" ng-if="!isInstallCompanySelectedAndScheduleDisabled()">
<form name="form" class="col-md-4">
<div ngf-drop="uploadFile($file)"
ng-model="files"
ngf-drag-over-class="'dragover'"
ngf-select="uploadFile($file)"
ngf-pattern="'.pdf,.docx,.doc,.xlsx,.xls,.odt,.ods,.png,.jpg,.jpeg'"
ngf-max-size="20MB"
class="drop-box">{{'orders.headers.SELECT_INSTALL_DOCUMENT' | translate}}</div>
</form>
<div class="uploaded-documents col-md-8">
<div class="document-layer" ng-repeat="document in installationDocuments">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
{{document.documentName}}.{{document.extension}}
</a>
<div id="remove-document-{{document.idDocument}}" class="remove-document" ng-if="document.isUploadedByMe">
<span class="remove-document-btn glyphicon glyphicon-remove" ng-click="showHideDialog(document.idDocument)">
{{'orders.tables.extra.REMOVE' | translate}}
</span>
<div id="confirm-remove-document"
dialog
ng-if="isDialogVisible[document.idDocument]"
on-confirmation="removeInstallDocument"
on-close="showHideDialog"
is-modal="true"
has-buttons="true"
parameters="document.idDocument"
title="{{'orders.headers.REMOVE_DOCUMENT' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.REMOVE_DOCUMENT_CONFIRMATION' | translate}} <b>{{document.documentName}}.{{document.extension}}</b>?</p>
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
<div class="change-installation-btn col-md-12"
ng-if="isChangeInstallationAvailable"
ng-click="showHideChangingInstallationDialog()">
<div class="alert alert-info col-md-5">
<span class="glyphicon glyphicon-refresh"></span>
{{'orders.headers.CHANGE_INSTALLATION_COMPANY' | translate}}
</div>
<div id="confirm-possibility-to-change-installation-company"
dialog
ng-if="isChangingInstallationDialogVisible"
on-confirmation="activateChangeInstallation"
on-close="showHideChangingInstallationDialog"
is-modal="true"
has-buttons="true"
title="{{'orders.headers.ACTIVATE_CHANGE_INSTALLATION_COMPANY' | translate}}">
<p class="alert alert-warning"><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.ACTIVATE_CHANGE_INSTALLATION_COMPANY_CONFIRM' | translate}}</p>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,36 @@
<div id="installation-scheduler-container" ng-controller="installationSchedulerCtrl" ng-init="getInstallationDetails()">
<div ng-if="isInstallationInOrder" class="col-md-5 outside-process-steps">
<h3 class="additional-procurement-header">{{'orders.headers.INSTALLATION_SCHEDULING' | translate}}</h3>
<hr />
<fieldset ng-disabled="isInstallationSchedulingDisabled()" class="set-installation-dates">
<div class="choose-installation-layer row">
<div class="col-md-12" ng-if="isInstallationSet">
<label class="col-md-5">{{'orders.tables.extra.INSTALLATION_COMPANY' | translate}}:</label>
{{installationCompany.name}}
</div>
<div class="col-md-12" ng-if="!isInstallationSet">
<label class="col-md-5">{{'orders.tables.extra.INSTALLATION_COMPANY_NOT_CHOSEN' | translate}}:</label>
</div>
</div>
<?php
require_once('DisplayEarliestInstallationDate.html');
?>
<div id="propose-installation-dates" class="row">
<?php
require('InstallationSchedulingDatesTemplate.html');
?>
</div>
<div id="installation-files-container" class="uploaded-documents col-md-12" ng-if="installationDocuments">
<h3 class="additional-procurement-header col-md-12">{{'orders.messages.INSTALLATION_PROTOCOL' | translate}}</h3>
<div class="installation-protocol-doc col-md-12" ng-repeat="document in installationDocuments">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}&fileType=installationProtocol">
{{document.documentName}}.{{document.extension}}
</a>
</div>
</div>
</fieldset>
</div>
</div>

View File

@@ -0,0 +1,55 @@
<div id="installation-scheduler-container" ng-controller="installationSchedulerCtrl" ng-init="getInstallationDetails()">
<div ng-if="isMyInstallationCompany" class="col-md-5 outside-process-steps">
<h3 class="additional-procurement-header">{{'orders.headers.INSTALLATION_SCHEDULING' | translate}}</h3>
<hr />
<fieldset ng-disabled="isInstallationSchedulingDisabled()" class="set-installation-dates">
<div class="choose-installation-layer row">
<div class="col-md-12">
<label class="col-md-5">{{'orders.tables.extra.INSTALLATION_COMPANY' | translate}}:</label>
{{installationCompany.name}}
</div>
</div>
<div id="propose-installation-dates" class="row">
<?php
require('InstallationSchedulingDatesTemplate.html');
?>
<div id="installation-files-container" class="col-md-12" ng-if="!isInstallCompanySelectedAndScheduleDisabled()">
<form name="form" class="col-md-4">
<div ngf-drop="uploadFile($file)"
ng-model="files"
ngf-drag-over-class="'dragover'"
ngf-select="uploadFile($file)"
ngf-pattern="'.pdf,.docx,.doc,.xlsx,.xls,.odt,.ods,.png,.jpg,.jpeg'"
ngf-max-size="20MB"
class="drop-box">{{'orders.headers.SELECT_INSTALL_DOCUMENT' | translate}}</div>
</form>
<div class="uploaded-documents col-md-8">
<div class="document-layer" ng-repeat="document in installationDocuments">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
{{document.documentName}}.{{document.extension}}
</a>
<div id="remove-document-{{document.idDocument}}" class="remove-document" ng-if="document.isUploadedByMe">
<span class="remove-document-btn glyphicon glyphicon-remove" ng-click="showHideDialog(document.idDocument)">
{{'orders.tables.extra.REMOVE' | translate}}
</span>
<div id="confirm-remove-document"
dialog
ng-if="isDialogVisible[document.idDocument]"
on-confirmation="removeInstallDocument"
on-close="showHideDialog"
is-modal="true"
has-buttons="true"
parameters="document.idDocument"
title="{{'orders.headers.REMOVE_DOCUMENT' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.REMOVE_DOCUMENT_CONFIRMATION' | translate}} <b>{{document.documentName}}.{{document.extension}}</b>?</p>
</div>
</div>
</div>
</div>
</div>
</div>
</fieldset>
</div>
</div>

View File

@@ -0,0 +1,101 @@
<div class="confirmation-dates-container col-md-12">
<div class="installation-dates-history col-md-12" ng-repeat="(confirmationDate, dateInfo) in confirmationDates">
<div id="installation-scheduling-dates-container" class="col-md-12">
<div class="col-md-11">
<span class="installation-date-proposed confirmation-{{dateInfo.lastStatus}} col-md-3">{{confirmationDate}}</span>
<div id="accept-date-{{idPackage}}-{{confirmationDate}}"
class="remove-date col-md-2 btn btn-success"
ng-if="canUserAcceptOrDecline(confirmationDate, dateInfo, 'declined')"
ng-click="showHideAcceptDialog(confirmationDate)">
<span class="remove-date-btn glyphicon glyphicon-ok">
{{'orders.tables.extra.ACCEPT' | translate}}
</span>
<div id="confirm-cancel-accept-installation-dates-{{idPackage}}"
dialog
ng-if="isAcceptDialogVisible[confirmationDate]"
on-confirmation="userButtonAction"
on-close="showHideAcceptDialog(confirmationDate)"
is-modal="true"
has-buttons="true"
parameters="{confirmationDate, userStatus: 'accepted'}"
title="{{'orders.headers.ACCEPT_MY_DATE' | translate}}">
<p>
<div ng-if="isDateAlreadyAccepted">
{{'orders.messages.MULTIPLE_ACCEPT_INSTALLATION' | translate}}
</div>
<span class="glyphicon glyphicon-warning-sign"></span>
{{'orders.messages.ACCEPT_INSTALLATION' | translate}} <b>{{confirmationDate}}</b>?
</p>
</div>
</div>
<div id="decline-date-{{idPackage}}-{{confirmationDate}}"
class="remove-date {{offsetClass}} col-md-2 btn btn-danger"
ng-if="canUserAcceptOrDecline(confirmationDate, dateInfo,'accepted')"
ng-click="showHideDeclineDialog(confirmationDate)">
<span class="remove-date-btn glyphicon glyphicon-remove">
{{'orders.tables.extra.DECLINE' | translate}}
</span>
<div id="confirm-cancel-decline-installation-dates-{{idPackage}}"
dialog
ng-if="isDeclineDialogVisible[confirmationDate]"
on-confirmation="userButtonAction"
on-close="showHideDeclineDialog(confirmationDate)"
is-modal="true"
has-buttons="true"
parameters="{confirmationDate, userStatus: 'declined'}"
title="{{'orders.headers.DECLINE_MY_DATE' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.DECLINE_INSTALLATION' | translate}} <b>{{confirmationDate}}</b>?</p>
</div>
</div>
<div id="remove-date-{{idPackage}}-{{confirmationDate}}"
class="remove-date col-md-offset-7 col-md-2 btn btn-primary"
ng-if="isRemoveBtnVisible(confirmationDate)"
ng-click="showHideRemoveDialog(confirmationDate)">
<span class="remove-date-btn glyphicon glyphicon-trash">
{{'orders.tables.extra.REMOVE' | translate}}
</span>
<div id="confirm-cancel-remove-installation-dates-{{idPackage}}"
dialog
ng-if="isRemoveDialogVisible[confirmationDate]"
on-confirmation="removeMyDate"
on-close="showHideRemoveDialog(confirmationDate)"
is-modal="true"
has-buttons="true"
parameters="confirmationDate"
title="{{'orders.headers.REMOVE_MY_DATE' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.REMOVE_INSTALLATION' | translate}} <b>{{confirmationDate}}</b>?</p>
</div>
</div>
</div>
<span class="dates-info-btn glyphicon glyphicon-info-sign col-md-1" ng-click="showDateDetails(dateInfo)"></span>
<div class="date-row col-md-12" ng-if="dateInfo.isInfoVisible" ng-repeat="(key, details) in dateInfo.details">
<div class="col-md-4">
{{details.currentDate}}
</div>
<div class="col-md-3 confirmation-{{details.status}}">
<span class="glyphicon glyphicon-{{getIcon(details.status)}}"></span>
{{details.status}}
</div>
<div class="col-md-5">
{{details.username}} ({{details.userType}})
</div>
</div>
</div>
</div>
</div>
<div class="add-new-date col-md-12" ng-show="showAddNewDate">
<label class="col-md-6">{{'orders.tables.extra.INSTALLATION_DATE_PROPOSE' | translate}}</label>
<input ng-model="installationDate"
class="col-md-3"
on-date-selected="updateInstallationDate"
datepicker
id="installation-date-propose-{{idPackage}}"/>
</div>
<div class="add-new-date-btn col-md-12" ng-if="!isInstallCompanySelectedAndScheduleDisabled()">
<div class="col-md-3 btn btn-primary" ng-click="shouldShowAddNewDate()">
<span class="glyphicon glyphicon-plus"></span>
<span class="add-new-schedule">{{'orders.buttons.ADD_OPTIONAL_DATE' | translate}}</span>
</div>
</div>

View File

@@ -0,0 +1,55 @@
<div class="order-details-extra-info col-md-4">
<div class="order-details-items">
<div class="order-details-label">{{'orders.tables.headers.orderItems' | translate}}</div>
<div class="order-details-item" ng-repeat="package in data.packages">
<div class="package-item-name">{{package.units}} x {{package.packageName}}</div>
<div class="package-item-info">
<div class="package-item-box">
<div class="order-details-label">Price:</div>
<div class="order-details-info order-details-price">{{calculatePrice([package.packageFixedPrice], package.units)}}
( {{calculatePrice([package.packageRecuringPrice, package.packageServicePrice], package.units)}} / {{package.periodUnit}} )</div>
</div>
<div class="prices-info">
<div class="order-text">
<span ng-if="package.packagePayPeriod > 0">
{{'orders.tables.extra.PACKAGE_RECURENT' | translate}}
{{package.units}} x {{package.packageRecuringPrice}} / {{package.periodUnit}}
{{'orders.tables.extra.FOR' | translate}} {{package.packagePayPeriod}} {{package.periodUnit}}
</span>
</div>
<div class="order-text">
{{'orders.tables.extra.SERVICE_AND_SUPPORT' | translate}}
{{package.units}} x {{package.packageServicePrice}} / {{package.periodUnit}}
<span ng-if="package.servicesContractPeriod > 0">{{'orders.tables.extra.FOR' | translate}} {{package.servicesContractPeriod}} {{package.periodUnit}}</span>
{{'orders.tables.extra.EXTEND' | translate}} {{package.periodUnit}} (Max {{package.maxContractPeriod}})
</div>
</div>
<div ng-if="hasAgreement(package.packagePayPeriod, package.servicesContractPeriod)" class="package-item-box">
<div class="order-details-label">{{'orders.tables.headers.agreement' | translate}}:</div>
<div class="order-info-box" ng-if="package.packagePayPeriod > 0">
{{'orders.tables.extra.PACKAGE_AGREEMENT' | translate}}
{{package.packagePayPeriod}} {{package.periodUnit}}
</div>
<div class="order-info-box" ng-if="package.servicesContractPeriod > 0">
{{'orders.tables.extra.SERVICES_AGREEMENT' | translate}}
{{package.servicesContractPeriod}} {{package.periodUnit}}
</div>
</div>
<div ng-if="package.shortDesc" class="package-item-box">
<div class="order-details-label">{{'orders.tables.headers.step' | translate}}:</div>
<div class="order-details-info">{{package.shortDesc}}</div>
</div>
</div>
<div class="package-item-status order-status-{{package.status}}">
<span class="{{getStatusIcon(package.status)}}"></span>
</div>
</div>
</div>
</div>
<div class="order-details-footer row">
<div class="order-details-total col-md-offset-10 col-md-2">
<div class="order-details-label">{{'orders.tables.headers.total' | translate}}: {{data.orderTotalPrice}}</div>
</div>
</div>
<div class="order-details-status detailed-status detailed-status-{{data.status}}">{{data.status}}</div>

View File

@@ -0,0 +1,9 @@
<div class="order-details-comercial-lead col-md-2">
<h5>{{'orders.tables.headers.commercialLead' | translate}}: {{data.commercialLead}}</h5>
<div class="order-details-label">{{'orders.tables.headers.phone' | translate}}:</div>
<div class="order-details-info">{{data.commercialLeadPhone}}</div>
<div class="order-details-label">{{'orders.tables.headers.mail' | translate}}:</div>
<div class="order-details-info">{{data.commercialLeadMail}}</div>
</div>

View File

@@ -0,0 +1,12 @@
<div class="order-details-customer col-md-2">
<h5>{{'orders.tables.headers.customer' | translate}}: {{data.customer}}</h5>
<div class="order-details-label">{{'orders.tables.headers.deliveryAddress' | translate}}:</div>
<div class="order-details-info">{{data.deliveryAddress}}</div>
<div class="order-details-label">{{'orders.tables.headers.phone' | translate}}:</div>
<div class="order-details-info">{{data.customerPhone}}</div>
<div class="order-details-label">{{'orders.tables.headers.mail' | translate}}:</div>
<div class="order-details-info">{{data.customerMail}}</div>
</div>

View File

@@ -0,0 +1,19 @@
<div class="order-details-extra-info col-md-4">
<div class="order-details-items">
<div class="order-details-label">{{'orders.tables.headers.orderItems' | translate}}</div>
<div class="order-details-item" ng-repeat="package in data.packages">
<div class="package-item-name">{{package.units}} x {{package.packageName}}</div>
<div class="package-item-info">
<div ng-if="package.shortDesc" class="package-item-box">
<div class="order-details-label">{{'orders.tables.headers.step' | translate}}:</div>
<div class="order-details-info">{{package.shortDesc}}</div>
</div>
</div>
<div class="package-item-status order-status-{{package.status}}">
<span class="{{getStatusIcon(package.status)}}"></span>
</div>
</div>
</div>
</div>
<div class="order-details-status detailed-status detailed-status-{{data.status}}">{{data.status}}</div>

View File

@@ -0,0 +1,2 @@
<div class="order-label">{{'orders.tables.headers.estimatedDeliveryDate' | translate}}: </div>
<span>{{ordersInfo.estimatedDeliveryDate}}</span>

View File

@@ -0,0 +1 @@
<span class="order-info-toggle glyphicon {{getIconStepStatus()}}" ng-click="toggleInfo($event)"></span>

View File

@@ -0,0 +1,13 @@
<div class="order-details row">
<?php
require_once('OrderDetailsCustomer.html');
if($user->getUserType() === USER_TYPES['BROKER'] || $user->getUserType() === USER_TYPES['CUSTOMER']){
require_once('OrderDetailsCommercialLead.html');
require_once('OrderDetailsAllTemplate.php');
}
if($user->getUserType() === USER_TYPES['SUPPLIER']){
require_once('OrderDetailsSupplierTemplate.php');
}
?>

View File

@@ -0,0 +1,33 @@
<div ng-bind-html="renderHtml(step.fullDesc)" class="order-step-full-description order-toggle-info {{getDisplayDescriptionClass()}}">
</div>
<div class="order-step-estimation">
<span class="step-acutal-date">{{'orders.tables.headers.actualDate' | translate}}: </span>
<input ng-model="step.actualDate"
element-data="step"
on-date-selected="updateStepActualDate"
datepicker
ng-disabled="isEstimationDisabled(step.status)"
id="step-actual-{{step.idProcessStep}}-{{step.idPackage}}"
class="step-estimated-date" />
</div>
{{'orders.tables.headers.comments' | translate}}:
<div class="order-step-comment" ng-repeat="commentObj in step.comments">
<div class="order-comment-date">{{commentObj.user}} - {{commentObj.addDate}}:</div>
<div ng-click="updateStepCommentVisibility(commentObj)"
class="comment-glyphicon glyphicon {{isCommentVisible(commentObj.isVisible, step.isVisibleForCustomer)}}"></div>
<div class="order-comment-label">{{commentObj.comment}}</div>
</div>
<div class="order-step-comments-container" ng-if="canAddComment(step)">
<textarea type="text"
ng-model="stepCommentText"
class="form-control order-step-comment-textarea"
placeholder="{{'orders.tables.headers.comments' | translate}}"></textarea>
<div class="btn btn-primary col-md-4" ng-click="updateStepComment(stepCommentText, step)">
{{ 'orders.buttons.SUBMIT' | translate }}
</div>
</div>
<div ng-click="setNewCommentVisibility(step)"
ng-if="canAddComment(step)"
class="comment-glyphicon glyphicon {{isCommentVisible(step.isNewCommentVisible, step.isVisibleForCustomer)}}"></div>

View File

@@ -0,0 +1,19 @@
<div class="order-step-estimation">
<span class="step-acutal-date">{{'orders.tables.headers.actualDate' | translate}}: {{step.actualDate}}</span>
</div>
{{'orders.tables.headers.comments' | translate}}:
<div class="order-step-comment" ng-repeat="commentObj in step.comments">
<div class="order-comment-date">{{commentObj.user}} - {{commentObj.addDate}}:</div>
<div class="order-comment-label">{{commentObj.comment}}</div>
</div>
<div class="order-step-comments-container" ng-if="canAddComment(step)">
<textarea type="text"
ng-model="stepCommentText"
class="form-control order-step-comment-textarea"
placeholder="{{'orders.tables.headers.comments' | translate}}"></textarea>
<div class="btn btn-primary col-md-4" ng-click="updateStepComment(stepCommentText, step)">
{{ 'orders.buttons.SUBMIT' | translate }}
</div>
</div>

View File

@@ -0,0 +1,60 @@
<button type="button"
id="ongoing-orders-btn"
subModule="ongoing_orders"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'orders.buttons.SHOW_ONGOING_ORDERS' | translate }}</button>
<button type="button"
id="orders-history-btn"
subModule="orders_history"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'orders.buttons.SHOW_ORDERS_HISTORY' | translate }}</button>
<button type="button"
id="order-projects-btn"
subModule="orderProjects"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'orders.buttons.ORDER_PROJECTS' | translate }}</button>
<div class="row">
<div class="col-sm-12"
id="orders-layer"
ng-if="isSubmoduleVisible('ongoing_orders')"
ng-init="getOngoingOrders()">
<h3>{{ 'orders.headers.SHOW_ONGOING_ORDERS' | translate }}</h3>
<table class="table table-bordered table-striped table-hover" id="ongoing-orders"></table>
</div>
</div>
<div class="row">
<div class="col-sm-12"
id="orders-hostory-layer"
ng-if="isSubmoduleVisible('orders_history')"
ng-init="getOrdersHistory()">
<h3>{{ 'orders.headers.SHOW_ORDERS_HISTORY' | translate }}</h3>
<table class="table table-bordered table-striped table-hover" id="orders-history"></table>
</div>
</div>
<div class="row">
<div class="col-sm-12"
id="order-projects-layer"
ng-if="isSubmoduleVisible('orderProjects')"
ng-init="getOrderProjects()">
<h3>{{ 'orders.headers.SHOW_ORDER_PROJECTS' | translate }}</h3>
<order-projects ng-controller="orderProjectsController" ng-init="getOrderProjectsHeaders()"></order-projects>
</div>
</div>
<div class="row">
<div class="col-sm-12"
id="change-orders-steps-module"
ng-if="isSubmoduleVisible('orders_steps')">
<?php
if(in_array($user->getUserType(), [USER_TYPES['BROKER'], USER_TYPES['CUSTOMER'], USER_TYPES['COMMERCIAL_LEAD']]) ){
echo '<change-orders-steps ng-controller="changeOrdersStepsCtrl" ng-init="startOrdersStepsModule()"></change-orders-steps>';
}else{
echo '<suppliers-procurement-view ng-controller="suppliersProcurementViewCtrl" ng-init="getOrderSteps()"></suppliers-procurement-view>';
}
?>
</div>
</div>

View File

@@ -0,0 +1,178 @@
<div id="set-delivery-dates-container" ng-controller="setDeliveryDatesCtrl" ng-init="getEstimationsAndEarliestInstallDate()">
<div ng-if="areProductsInOrder" class="col-md-5 outside-process-steps">
<h3 class="additional-procurement-header">{{'orders.headers.SET_DELIVERY_DATES' | translate}}</h3>
<hr />
<fieldset ng-disabled="isSetDeliveryDatesDisabled()">
<div class="delivery-dates-header row">
<div class="supplier-header col-md-5">{{ 'orders.tables.extra.SUPPLIERS' | translate }}</div>
<div class="supplier-header col-md-3">{{ 'orders.tables.headers.estimatedDate' | translate }}</div>
<div class="supplier-header col-md-3">{{ 'orders.tables.headers.confirmedDate' | translate }}</div>
</div>
<div class="supplier-layer row" ng-repeat="supplierEstimation in supplierEstimations">
<div class="product-layer col-md-12">
<div class="prdocut-name col-md-5">
<div class="col-md-12">
{{supplierEstimation.supplierName}}
</div>
</div>
<div class="prdocut-estimated col-md-3">
<div ng-if="!isDateEditable('estimatedDate', supplierEstimation)" class="display-date">
{{supplierEstimation.estimatedDate}}
</div>
<input class="date-input product-input"
ng-if="isDateEditable('estimatedDate', supplierEstimation)"
placeholder="{{ 'orders.tables.headers.estimatedDate' | translate }}"
element-data="supplierEstimation"
datepicker
on-date-selected="updateSupplierEstimation"
ng-model="supplierEstimation.estimatedDate" />
<span ng-if="!isDateEditable('estimatedDate', supplierEstimation)"
ng-click="openDatePicker('estimatedDate', supplierEstimation.idSupplier)"
class="edit-date glyphicon glyphicon-pencil"></span>
<div class="remove-date-icon-container">
<span ng-if="supplierEstimation.estimatedDate"
ng-click="showHideRemoveDatesDialog('estimated', supplierEstimation)"
class="remove-estiamted glyphicon glyphicon-remove"></span>
<div id="confirm-remove-estimation-date-{{idOrder}}-{{supplierEstimation.idSupplier}}"
dialog
ng-if="isRemoveDatesDialogVisible['estimated'][supplierEstimation.idSupplier]"
on-confirmation="removeSupplierEstimation"
on-close="showHideRemoveDatesDialog('estimated', supplierEstimation)"
is-modal="true"
has-buttons="true"
parameters="{idSupplier: supplierEstimation.idSupplier, type: 'estimation'}"
title="{{'orders.headers.REMOVE_DATES' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.REMOVE_ESTIMATED_DATE' | translate}} <b>{{supplierEstimation.estimatedDate}}</b>?</p>
</div>
</div>
</div>
<div class="prdocut-confimrmed col-md-3">
<div ng-if="!isDateEditable('confirmedDate', supplierEstimation)" class="display-date">
{{supplierEstimation.confirmedDate}}
</div>
<input class="date-input product-input"
ng-if="isDateEditable('confirmedDate', supplierEstimation)"
placeholder="{{ 'orders.tables.headers.confirmedDate' | translate }}"
element-data="supplierEstimation"
datepicker
on-date-selected="updateSupplierEstimation"
ng-model="supplierEstimation.confirmedDate" />
<span ng-if="!isDateEditable('confirmedDate', supplierEstimation)"
ng-click="openDatePicker('confirmedDate', supplierEstimation.idSupplier)"
class="edit-date glyphicon glyphicon-pencil"></span>
<div class="remove-date-icon-container">
<span ng-if="supplierEstimation.confirmedDate"
ng-click="showHideRemoveDatesDialog('confirmed', supplierEstimation)"
class="remove-confirmed glyphicon glyphicon-remove"></span>
<div id="confirm-remove-estimation-date-{{idOrder}}-{{supplierEstimation.idSupplier}}"
dialog
ng-if="isRemoveDatesDialogVisible['confirmed'][supplierEstimation.idSupplier]"
on-confirmation="removeSupplierEstimation"
on-close="showHideRemoveDatesDialog('confirmed', supplierEstimation)"
is-modal="true"
has-buttons="true"
parameters="{idSupplier: supplierEstimation.idSupplier, type: 'confirmation'}"
title="{{'orders.headers.REMOVE_DATES' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.REMOVE_CONFIRMED_DATE' | translate}} <b>{{supplierEstimation.confirmedDate}}</b>?</p>
</div>
</div>
</div>
<div class="col-md-1">
<span class="glyphicon {{getEstimationIcon(supplierEstimation.confirmedDate)}}"></span>
</div>
</div>
<div class="traking-layer col-md-12">
<div>
{{'orders.headers.TRACKING' | translate}}
</div>
<div ng-if="!isSetDeliveryDatesDisabled()">
<div ng-repeat="trackingInfo in supplierEstimation.trackings">
<input type="text"
class="product-input col-md-2"
placeholder="{{ 'orders.tables.headers.trackingNumber' | translate }}"
ng-model="trackingInfo.trackingNumber"/>
<input type="text"
class="product-input col-md-8"
placeholder="{{ 'orders.tables.headers.trackingUrl' | translate }}"
ng-model="trackingInfo.trackingUrl"/>
<div id="remove-tracking-{{idOrder}}-{{idPackage}}-{{trackingInfo.idSupplier}}"
class="remove-date col-md-1"
ng-click="showHideRemoveDialog(trackingInfo.idTracking)">
<span class="remove-date-btn glyphicon glyphicon-trash"></span>
<div id="confirm-remove-tracking-{{idOrder}}-{{idPackage}}-{{trackingInfo.idSupplier}}"
dialog
ng-if="isRemoveDialogVisible[trackingInfo.idTracking]"
on-confirmation="removeTracking"
on-close="showHideRemoveDialog(trackingInfo.idTracking)"
is-modal="true"
has-buttons="true"
parameters="trackingInfo"
title="{{'orders.headers.REMOVE_TRACKING' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.REMOVE_TRACKING' | translate}} <b>{{trackingInfo.trackingNumber}}</b>?</p>
</div>
</div>
<div class="col-md-1">
<div class="btn btn-primary save-traking-btn"
ng-click="updateTracking(trackingInfo)">
{{ 'orders.buttons.SAVE' | translate }}
</div>
</div>
</div>
<div ng-if="showAddNewTracking[supplierEstimation.idSupplier]">
<input type="text"
class="product-input col-md-3"
placeholder="{{ 'orders.tables.headers.trackingNumber' | translate }}"
ng-model="trackingNumber"/>
<input type="text"
class="product-input col-md-7"
placeholder="{{ 'orders.tables.headers.trackingUrl' | translate }}"
ng-model="trackingUrl"/>
<div class="col-md-2">
<div class="btn btn-primary save-traking-btn"
ng-click="addTracking(supplierEstimation.idSupplier, trackingNumber, trackingUrl)">
{{ 'orders.buttons.ADD_TRACKING' | translate }}
</div>
</div>
</div>
<div class="add-new-traking-btn col-md-12">
<div class="col-md-5 btn btn-primary" ng-click="shouldShowAddNewTracking(supplierEstimation.idSupplier)">
<span class="glyphicon glyphicon-plus"></span>
<span class="add-new-schedule">{{'orders.buttons.ADD_ANOTHER_TRACKING' | translate}}</span>
</div>
</div>
</div>
<div ng-if="isSetDeliveryDatesDisabled()">
<div class="col-md-12" ng-if="isTrackingEmpty(supplierEstimation.trackings)">{{'orders.messages.TRACKING_EMPTY' | translate}}</div>
<div class="display-tracking-info col-md-12" ng-if="!isTrackingEmpty(supplierEstimation.trackings)" ng-repeat="trackingInfo in supplierEstimation.trackings">
<span class="col-md-2">{{trackingInfo.trackingNumber}}</span>
<span class="col-md-10">
<a href="{{trackingInfo.trackingUrl}}" target="_blank">{{trackingInfo.trackingUrl}}</a>
</span>
</div>
</div>
</div>
</div>
<div class="row">
<div class="final-dates-layer col-md-12">
<div class="col-md-6">{{'orders.headers.FINAL_DATES' | translate}}:</div>
<div class="final-esimation col-md-3">{{getEstimatedOrConfirmedMaxDate('estimatedDate')}}</div>
<div class="final-confirmation col-md-3">{{getEstimatedOrConfirmedMaxDate('confirmedDate')}}</div>
</div>
</div>
<?php
if($user->getUserType() === USER_TYPES['BROKER']) {
require_once('DisplayEarliestInstallationDate.html');
}
?>
</fieldset>
</div>
</div>

View File

@@ -0,0 +1,25 @@
<div id="order-chose-process" class="col-md-6" ng-if="hasNoSelectedProcess(ordersInfo.status)">
<div class="package-steps">
<div class="order-label">{{'orders.messages.SELECT_A_PROCESS' | translate}}: </div>
<div class="order-available-processes-layer">
<div class="order-available-process" ng-repeat="availableProcess in availableProcesses">
<div class="order-process-name">{{availableProcess.processName}}</div>
<div class="order-process-chose-btn btn btn-primary"
ng-click="showHideProcessDialog(availableProcess)">
{{'orders.buttons.USE_THIS' | translate}}
</div>
</div>
</div>
</div>
</div>
<div id="dialog-process-confirm"
dialog
ng-if="isProcessDialogVisible"
on-confirmation="setProcessForOrder"
on-close="showHideProcessDialog"
is-modal="true"
has-buttons="true"
parameters="selectedProcess"
title="{{'orders.headers.PROCESS_CONFIRMATION' | translate}}">
<p><span class="glyphicon glyphicon-info-sign"></span>{{'orders.messages.PROCESS_CONFIRMATION' | translate}} {{selectedProcess.processName}}?</p>
</div>

View File

@@ -0,0 +1,39 @@
<div id="show-delivery-dates-cl-container" class="col-md-5 outside-process-steps" ng-controller="setDeliveryDatesCtrl" ng-init="getEstimationsAndEarliestInstallDate()">
<h3 class="additional-procurement-header">{{'orders.headers.SET_DELIVERY_DATES' | translate}}</h3>
<hr />
<fieldset ng-disabled="isSetDeliveryDatesDisabled()">
<div class="delivery-dates-header row">
<div class="supplier-header col-md-5">{{ 'orders.tables.extra.SUPPLIERS' | translate }}</div>
<div class="supplier-header col-md-3">{{ 'orders.tables.headers.estimatedDate' | translate }}</div>
<div class="supplier-header col-md-3">{{ 'orders.tables.headers.confirmedDate' | translate }}</div>
</div>
<div class="row">
<div class="final-dates-layer-cl col-md-12">
<div class="col-md-6">{{'orders.headers.FINAL_DATES' | translate}}:</div>
<div class="final-esimation col-md-3">{{getEstimatedOrConfirmedMaxDate('estimatedDate')}}</div>
<div class="final-confirmation col-md-3">{{getEstimatedOrConfirmedMaxDate('confirmedDate')}}</div>
</div>
</div>
<div class="supplier-layer row" ng-repeat="supplierEstimation in supplierEstimations">
<div class="supplier-header col-md-12">{{supplierEstimation.supplierName}}</div>
<div class="traking-layer col-md-12">
<div>
{{'orders.headers.TRACKING' | translate}}
</div>
<div>
<div class="col-md-12" ng-if="isTrackingEmpty(supplierEstimation.trackings)">{{'orders.messages.TRACKING_EMPTY' | translate}}</div>
<div class="display-tracking-info col-md-12" ng-if="!isTrackingEmpty(supplierEstimation.trackings)" ng-repeat="trackingInfo in supplierEstimation.trackings">
<span class="col-md-2">{{trackingInfo.trackingNumber}}</span>
<span class="col-md-10">
<a href="{{trackingInfo.trackingUrl}}" target="_blank">{{trackingInfo.trackingUrl}}</a>
</span>
</div>
</div>
</div>
</div>
</fieldset>
</div>

View File

@@ -0,0 +1,9 @@
<div id="order-package-no-process-{{package.idPackage}}" class="col-md-6" ng-repeat="package in packages" ng-if="hasNoSelectedProcess(package.status)">
<div class="package-steps">
<h4>{{package.packageName}}</h4>
<div class="alert alert-info col-md-12">
<span class="glyphicon glyphicon-info-sign"></span>
{{'orders.messages.NO_PROCESS_ASSIGNED' | translate}}
</div>
</div>
</div>

View File

@@ -0,0 +1,13 @@
<div id="package-layer-{{process.idPackage}}" class="col-md-12" ng-repeat="process in processSteps">
<div id="change-orders-steps-layer">
<div class="package-steps col-md-12">
<h4>{{process.processName}} {{'orders.headers.STEP_ORDER_FOR' | translate}} {{process.packageName}}</h4>
<div>
<?php
require_once('SetDeliveryDatesTemplate.php');
require_once('InstallationSchedulerSupplierTemplate.php');
?>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,91 @@
<div id="send-support-mail" class="row">
<div class="order-informations col-md-12">
<h4>{{'orders.tables.extra.ORDER_DETAILS' | translate}}</h4>
<div>
<span class="order-number-icon">#</span>
<b>{{'orders.tables.headers.orderNumber' | translate}}: </b>
{{ordersDetails.orderNumber}}
</div>
<div ng-if="ordersDetails.reference">
<span class="glyphicon glyphicon-link"></span>
<b>{{'orders.tables.headers.reference' | translate}}: </b>
{{ordersDetails.reference}}
</div>
<div ng-if="ordersDetails.tender">
<span class="glyphicon glyphicon-dashboard"></span>
<b>{{'orders.tables.headers.tender' | translate}}: </b>
{{ordersDetails.tender}}
</div>
<div>
<span class="glyphicon glyphicon-user"></span>
<b>{{'orders.tables.headers.commercialLead' | translate}}: </b>
{{ordersDetails.commercialLead}}
</div>
<hr />
</div>
<div class="packages-info col-md-12">
<h4>{{'orders.tables.headers.orderItems' | translate}}</h4>
<div class="order-details-extra-info col-md-12">
<div class="order-details-item" ng-repeat="package in packages">
<div class="send-support-mail-details">
<span class="glyphicon glyphicon-shopping-cart"></span>
{{package.units}} x {{package.packageName}}
</div>
<div class="package-item-info">
<div class="send-support-mail-details">
<b>{{'orders.tables.extra.PRICE' | translate}}: </b>
{{calculatePrice([package.packageFixedPrice], package.units)}}
( {{calculatePrice([package.packageRecuringPrice, package.packageServicePrice], package.units)}} / {{package.periodUnit}} )
</div>
<div class="prices-info">
<div class="send-support-mail-details" ng-if="package.packagePayPeriod > 0">
{{'orders.tables.extra.PACKAGE_RECURENT' | translate}}
{{package.units}} x {{package.packageRecuringPrice}} / {{package.periodUnit}}
{{'orders.tables.extra.FOR' | translate}} {{package.packagePayPeriod}} {{package.periodUnit}}
</div>
<div class="send-support-mail-details">
<b>{{'orders.tables.extra.SERVICE_AND_SUPPORT' | translate}}: </b>
{{package.units}} x {{package.packageServicePrice}} / {{package.periodUnit}}
<span ng-if="package.servicesContractPeriod > 0">{{'orders.tables.extra.FOR' | translate}} {{package.servicesContractPeriod}} {{package.periodUnit}}</span>
{{'orders.tables.extra.EXTEND' | translate}} {{package.periodUnit}} (Max {{package.maxContractPeriod}})
</div>
</div>
<div ng-if="hasAgreement(package.packagePayPeriod, package.servicesContractPeriod)" class="send-support-mail-details">
<b>{{'orders.tables.headers.agreement' | translate}}: </b>
<div class="order-info-box" ng-if="package.packagePayPeriod > 0">
<b>{{'orders.tables.extra.PACKAGE_AGREEMENT' | translate}}: </b>
{{package.packagePayPeriod}} {{package.periodUnit}}
</div>
<div class="order-info-box" ng-if="package.servicesContractPeriod > 0">
<b>{{'orders.tables.extra.SERVICES_AGREEMENT' | translate}}: </b>
{{package.servicesContractPeriod}} {{package.periodUnit}}
</div>
</div>
<div ng-if="package.shortDesc" class="send-support-mail-details">
<b>{{'orders.tables.headers.step' | translate}}: </b>
{{package.shortDesc}}
</div>
<div ng-if="package.endOfLife" class="send-support-mail-details">
<b>{{'orders.tables.headers.endOfLife' | translate}}</b>:
{{package.endOfLife}}
</div>
<div class="package-item-status order-status-{{package.status}}">
<b>{{'orders.tables.headers.status' | translate}}: </b>
{{package.status}}
</div>
</div>
<hr />
</div>
</div>
</div>
<div class="order-support-mail-text">
<div class="mail-support-text-header col-md-12">
{{'orders.tables.extra.SUPPORT_USER_TEXT' | translate}}
</div>
<div id="mail-support-container" class="col-md-offset-1 col-md-10 col-md-offset-1">
<textarea class="mail-support-text col-md-12" ng-model="supportMailText"></textarea>
</div>
</div>
</div>

View File

@@ -0,0 +1,15 @@
<div class="chose-installation-layer row">
<div class="col-md-12" ng-if="multipleInstallCompanies">
<label class="col-md-4">{{'orders.tables.extra.CHOOSE_INSTALLATION' | translate}}</label>
<select id="installation-companies-group"
class="form-control-static col-md-4"
ng-model="step.installationCompany"
ng-options="installCompany.name for installCompany in step.installCompanies track by installCompany.id"
ng-change="saveInstallationForPackage(step)">
</select>
</div>
<div class="col-md-12">
<label class="col-md-4">{{'orders.tables.extra.INSTALLATION_COMPANY' | translate}}</label>
{{step.installationCompany.name}}
</div>
</div>

View File

@@ -0,0 +1,6 @@
<div class="chose-installation-layer row">
<div class="col-md-12">
<label class="col-md-4">{{'orders.tables.extra.INSTALLATION_COMPANY' | translate}}</label>
{{step.installationCompany.name}}
</div>
</div>

View File

@@ -0,0 +1,12 @@
<div id="choose-installation-company-extra-action" ng-controller="chooseInstallationCtrl" ng-init="getInstallCompaniesForPackage(step)">
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('chooseInstallationBrokerTemplate.php');
}else{
require_once('chooseInstallationCustomerTemplate.php');
}
?>
<div class="chose-installation-schedule">
<schedule-meeting ng-controller="scheduleMeetingCtrl"></schedule-meeting>
</div>
</div>

View File

@@ -0,0 +1,37 @@
<div class="acceptance-due-date col-md-12">
<div class="alert {{getDueDateClass()}}">
<label>{{'orders.headers.DUE_DATE_BROKER' | translate}}:</label>
{{acceptance.acceptanceDueDate}}
</div>
</div>
<div>
<div class="uploaded-documents col-md-12">
<div class="document-layer" ng-repeat="document in acceptance.acceptanceDocuments">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
{{document.documentName}}.{{document.extension}}
</a>
</div>
</div>
<div class="col-md-12">
<span class="not-accepted col-md-12" ng-if="!showCustomerAcceptance(acceptance.customerAccepted)">
<span class="glyphicon glyphicon-time"></span>
{{'orders.tables.extra.NOT_ACCEPTED_CUSTOMER_INSTALLATION' | translate}}
</span>
<div class="alert alert-{{getAcceptanceClass(acceptance.customerAccepted)}} col-md-12" ng-if="showCustomerAcceptance(acceptance.customerAccepted)">
<div class="col-md-12">
<span class="glyphicon glyphicon-{{getStatusIcon(acceptance.customerAccepted)}}"></span>
{{getCustomerAcceptanceDescription(acceptance.customerAccepted)}}
</div>
<div class="customer-installation-decline-reason col-md-12" ng-if="acceptance.customerDeclineReason">
<span>{{'orders.messages.DECLINE_REASON' | translate}}:</span>
<span>{{acceptance.customerDeclineReason}}</span>
</div>
</div>
</div>
<div ng-if="acceptance.idDocument" class="col-md-12">
<a href="utils/api/downloadFile?idDocument={{acceptance.idDocument}}&fileName={{acceptance.documentName}}.{{acceptance.extension}}">
{{acceptance.documentName}}.{{acceptance.extension}}
</a>
</div>
</div>

View File

@@ -0,0 +1,103 @@
<div class="acceptance-due-date col-md-12">
<div class="alert {{getDueDateClass()}}">
<label>{{'orders.headers.DUE_DATE_CUSTOMER' | translate}}:</label>
{{acceptance.acceptanceDueDate}}
</div>
<div class="alert alert-{{getAcceptanceClass(acceptance.customerAccepted)}} col-md-12" ng-if="showCustomerAcceptance(acceptance.customerAccepted)">
<div class="col-md-12">
<span class="glyphicon glyphicon-{{getStatusIcon(acceptance.customerAccepted)}}"></span>
{{getCustomerAcceptanceDescription(acceptance.customerAccepted)}}
</div>
<div class="customer-installation-decline-reason col-md-12" ng-if="acceptance.customerDeclineReason">
<span>{{'orders.messages.CUSTOMER_DECLINE_REASON' | translate}}:</span>
<span>{{acceptance.customerDeclineReason}}</span>
</div>
</div>
</div>
<div id="customer-acceptance-files-container" class="col-md-12">
<form name="form" class="col-md-4">
<div ngf-drop="uploadFile($file)"
ng-model="files"
ngf-drag-over-class="'dragover'"
ngf-select="uploadFile($file)"
ngf-pattern="'.pdf,.docx,.doc,.xlsx,.xls,.odt,.ods,.jpg,.png,.jpeg'"
ngf-max-size="20MB"
class="drop-box">{{'orders.headers.SELECT_ACCEPT_DOCUMENT' | translate}}</div>
</form>
<div class="uploaded-documents col-md-8">
<div class="document-layer" ng-repeat="document in acceptance.acceptanceDocuments">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
{{document.documentName}}.{{document.extension}}
</a>
<div id="remove-document-{{document.idDocument}}" class="remove-document">
<span class="remove-document-btn glyphicon glyphicon-remove" ng-click="showHideDialog(document.idDocument)">
{{'orders.tables.extra.REMOVE' | translate}}
</span>
<div id="confirm-remove-document"
dialog
ng-if="isDialogVisible[document.idDocument]"
on-confirmation="removeAcceptanceDocument"
on-close="showHideDialog"
is-modal="true"
has-buttons="true"
parameters="document.idDocument"
title="{{'orders.headers.REMOVE_DOCUMENT' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.REMOVE_DOCUMENT_CONFIRMATION' | translate}} <b>{{document.documentName}}.{{document.extension}}</b>?</p>
</div>
</div>
</div>
</div>
</div>
<div class="acceptance-button-layer col-md-12">
<div class="document-layer row" ng-if="acceptance.idDocument">
<a href="utils/api/downloadFile?idDocument={{acceptance.idDocument}}&fileName={{acceptance.documentName}}.{{acceptance.extension}}">
{{acceptance.documentName}}.{{acceptance.extension}}
</a>
</div>
<div class='row'>
<div class="install-btn btn btn-success col-md-5"
ng-disabled="isAcceptInstallationDisabled"
ng-click="showHideDialog('accept')">
{{'orders.buttons.ACCEPT_INSTALLATION' | translate}}
</div>
<div id="dialog-accept-installation-confirm"
dialog
ng-if="isDialogVisible['accept']"
on-confirmation="acceptDeclineInstallation"
on-close="showHideDialog"
is-modal="true"
has-buttons="true"
parameters="'accept'"
title="{{'orders.headers.CUSTOMER_INSTALLATION_ACCEPT' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.CUSTOMER_INSTALLATION_ACCEPT' | translate}}?</p>
</div>
<div class="install-btn btn btn-danger col-md-offset-1 col-md-5"
ng-disabled="isDeclineInstallationDisabled"
ng-click="showDeclineInstallation()">
{{'orders.buttons.DECLINE_INSTALLATION' | translate}}
</div>
</div>
<div class="decline-installation-container row" ng-if="isInstallationDeclined[acceptance.idPackage]">
<span class="col-md-12">{{'orders.tables.extra.DECLINED_CUSTOMER_INSTALLATION' | translate}}:</span>
<textarea id="installation-declined-reason" class="decline-installation-text col-md-12" ng-model="$parent.installationDeclinedReason"></textarea>
<div>
<div class="save-decline-install-btn install-btn btn btn-warning col-md-offset-8 col-md-4"
ng-click="showHideDialog('decline')">{{'orders.tables.extra.SAVE' | translate}}</div>
<div id="dialog-decline-installation-confirm"
dialog
ng-if="isDialogVisible['decline']"
on-confirmation="acceptDeclineInstallation"
on-close="showHideDialog"
is-modal="true"
has-buttons="true"
parameters="'decline'"
title="{{'orders.headers.CUSTOMER_INSTALLATION_DECLINE' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.CUSTOMER_INSTALLATION_DECLINE' | translate}}?</p>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,11 @@
<div id="customer-acceptance-extra-action" ng-controller="customerAcceptanceCtrl" ng-init="getCustmerAcceptance()">
<?php
if($user->getUserType() === USER_TYPES['CUSTOMER']){
require_once('customerAcceptanceCustomerTemplate.php');
}
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('customerAcceptanceBrokerTemplate.php');
}
?>
</div>

View File

@@ -0,0 +1,52 @@
<div class="supplier-layer row" ng-repeat="(supplierName, supplier) in suppliersData">
<div class="supplier-header col-md-12">{{supplierName}}</div>
<div class="document-types col-md-12">
<label>{{'orders.headers.PACKAGES' | translate}}: </label>
<select class="document-supplier-packages-for-order"
class="form-control-static add-document-value"
ng-model="package"
ng-options="package.packageName for package in $parent.packages track by package.idPackage"
ng-change="selectPackage(package, supplier.idSupplier)">
<option value="" disabled selected>{{'orders.headers.SELECT_PACKAGE' | translate}}</option>
</select>
</div>
<form name="form" class="col-md-4">
<div ngf-drop="uploadFile($file, supplier.idSupplier)"
ng-model="files"
ngf-drag-over-class="'dragover'"
ngf-select="uploadFile($file, supplier.idSupplier)"
ngf-pattern="'.pdf,.docx,.doc,.xlsx,.xls,.odt,.ods'"
ngf-max-size="20MB"
class="drop-box">{{'orders.headers.SELECT_CONFIG_DOCUMENT' | translate}}</div>
</form>
<div class="uploaded-documents col-md-8">
<div class="document-layer" ng-repeat="document in supplier.documents">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
{{document.documentName}}.{{document.extension}}
</a>
<div id="remove-document-{{document.idDocument}}" class="remove-document">
<span class="remove-document-btn glyphicon glyphicon-remove" ng-click="showHideDialog(document.idDocument)">
{{'orders.tables.extra.REMOVE' | translate}}
</span>
<div id="confirm-remove-document"
dialog
ng-if="isDialogVisible[document.idDocument]"
on-confirmation="removeOrderDocument"
on-close="showHideDialog"
is-modal="true"
has-buttons="true"
parameters="document"
title="{{'orders.headers.REMOVE_DOCUMENT' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.REMOVE_DOCUMENT_CONFIRMATION' | translate}} <b>{{document.documentName}}.{{document.extension}}</b>?</p>
</div>
</div>
</div>
</div>
<div ng-if="supplier.supplierBids.length > 0" class="supplier-bids col-md-12">
Bids: <span ng-repeat="supplierBid in supplier.supplierBids">{{supplierBid.bidNumber}} </span>
</div>
</div>
<a href="orders/excel/generateProcurementExcel?idOrder={{step.idOrder}}">
<div class="btn btn-primary">{{'orders.buttons.PROC_REPORT_BUTTON' | translate}}</div>
</a>

View File

@@ -0,0 +1,46 @@
<div class="supplier-layer row" ng-repeat="(supplierName, supplier) in productsEstimations">
<div class="supplier-header col-md-12">{{supplierName}}</div>
<div class="col-md-12">
<div class="col-md-3 col-md-offset-5">
{{ 'orders.tables.headers.estimatedDate' | translate }}
</div>
<div class="col-md-3">
{{ 'orders.tables.headers.confirmedDate' | translate }}
</div>
</div>
<div class="product-layer col-md-12" ng-repeat="product in supplier.estimations">
<div class="prdocut-name col-md-5">
{{product.productName}}
</div>
<div class="prdocut-estimated col-md-3">
<input class="product-input"
placeholder="{{ 'orders.tables.headers.estimatedDate' | translate }}"
element-data="product"
datepicker
on-date-selected="updateProductEstimation"
ng-model="product.estimatedDate" />
</div>
<div class="prdocut-confimrmed col-md-3">
<input class="product-input"
placeholder="{{ 'orders.tables.headers.confirmedDate' | translate }}"
element-data="product"
datepicker
on-date-selected="updateProductEstimation"
ng-model="product.confirmedDate" />
</div>
<div class="col-md-1">
<span class="glyphicon {{getEstimationIcon(product.confirmedDate)}}"></span>
</div>
</div>
<div class="uploaded-documents col-md-12">
<div class="document-layer" ng-repeat="document in supplier.documents">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
{{document.documentName}}.{{document.extension}}
</a>
</div>
</div>
</div>

View File

@@ -0,0 +1,11 @@
<div id="procuremnet-extra-action" ng-controller="procurementCtrl" ng-init="getSuppliersByPackageOrder()">
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('procurementBrokerTemplate.php');
}
if($user->getUserType() === USER_TYPES['SUPPLIER']){
require_once('procurementSupplierTemplate.php');
}
?>
</div>

View File

@@ -0,0 +1,27 @@
<div class="date-row col-md-12" ng-repeat="(key, scheduleDate) in step.scheduledDates">
<label class="col-md-5">{{'orders.tables.extra.DATE' | translate}}</label>
<input ng-model="scheduleDate.scheduledDate"
element-data="{step, scheduleDate}"
class="col-md-3"
on-date-selected="updateScheduledDates"
ng-disabled="canNotEditDate(scheduleDate)"
datepicker
id="schedule-date-{{scheduleDate.idPackage}}-{{scheduleDate.idProcessStep}}-{{key}}"/>
<div class="col-md-12" ng-repeat="userConfirmation in scheduleDate.confirmations">
<div class="col-md-5">
{{userConfirmation.username}} ({{userConfirmation.userType}})
</div>
<div class="col-md-2 confirmation-{{userConfirmation.status}}">
<span class="glyphicon glyphicon-{{getIcon(userConfirmation.status)}}"></span>
{{userConfirmation.status}}
</div>
</div>
</div>
<div class="col-md-12">
<div class="col-md-3 btn btn-primary" ng-click="addNewSchedule(step)">
<span class="glyphicon glyphicon-plus"></span>
<span class="add-new-schedule">{{'orders.buttons.ADD_OPTIONAL_DATE' | translate}}</span>
</div>
</div>

View File

@@ -0,0 +1,26 @@
<div class="date-row col-md-12" ng-repeat="scheduleDate in step.scheduledDates">
<label class="col-md-5">{{'orders.tables.extra.DATE' | translate}} </label>
<div class="col-md-3 schedule-date">
{{scheduleDate.scheduledDate}}
</div>
<div class="col-md-12" ng-repeat="userConfirmation in scheduleDate.confirmations">
<div class="col-md-5">
{{userConfirmation.username}} ({{userConfirmation.userType}})
</div>
<div class="confirmation-{{userConfirmation.status}} col-md-2">
<span class="glyphicon glyphicon-{{getIcon(userConfirmation.status)}}"></span>
{{userConfirmation.status}}
</div>
<div ng-click="changeScheduleStatus(scheduleDate, 'accepted', step)" class="col-md-2">
<div ng-if="!canNotEditDate(scheduleDate)" class="btn btn-success" ng-if="!canNotEditDate(scheduleDate)">
{{'orders.buttons.ACCEPT' | translate}}
</div>
</div>
<div ng-click="changeScheduleStatus(scheduleDate, 'declined', step)" class="col-md-2">
<div class="btn btn-danger">
{{'orders.buttons.DECLINE' | translate}}
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,13 @@
<div id="orders-steps-schedule" ng-controller="scheduleMeetingCtrl" ng-init="getScheduledDates(step)">
<div class="chose-scheduled-date-layer row">
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('scheduleMeetingBrokerTemplate.php');
}
if($user->getUserType() === USER_TYPES['CUSTOMER']){
require_once('scheduleMeetingCustomerTemplate.php');
}
?>
</div>
</div>

View File

@@ -0,0 +1,82 @@
<div id="validate-questionaire" ng-controller="validateQuestionnaireCtrl" ng-init="getDocumentsAndQuestionnaireComments()">
<div class="document-package-layer" ng-repeat="(key, packageDocuments) in customerDocuments">
<div class="document-layer" ng-repeat="document in packageDocuments">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
<div class="btn btn-primary document-name">
{{document.documentName}}.{{document.extension}}
</div>
</a>
<div class="document-status">
<span class="invalid" ng-if="getValidationStatus('invalid', document.validation)">
<span class="glyphicon glyphicon-remove"></span>
{{'orders.tables.extra.INVALID' | translate}}
</span>
</div>
<div class="validation-buttons">
<div class="btn btn-success"
ng-disabled="waitingResponseFromCustomer[document.idDocument]"
ng-click="showHideValidationDialog({idDocument: document.idDocument, validationStatus: 'validated'})">
{{'orders.tables.extra.VALID' | translate}}
</div>
<div id="dialog-validation-confirm"
dialog
ng-if="isValidationDialogVisible.validated[document.idDocument]"
on-confirmation="validateQuestionaire"
on-close="showHideValidationDialog"
is-modal="true"
has-buttons="true"
parameters="{idPackage:document.idPackage, idDocument: document.idDocument, validationStatus: 'validated'}"
title="{{'orders.headers.VALIDATE_QUESTIONAIER' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.VALIDATE_QUESTIONAIER' | translate}} {{'orders.tables.extra.VALID' | translate}}?</p>
</div>
<div class="btn btn-warning"
ng-disabled="waitingResponseFromCustomer[document.idDocument]"
ng-click="showInvalidTextbox(document.idDocument)">
{{'orders.tables.extra.INVALID' | translate}}
</div>
</div>
<div class="document-status">
<span class="not-validated" ng-if="getValidationStatus('not-validated', document.validation)">
<span class="glyphicon glyphicon-time"></span>
{{'orders.tables.extra.NOT_VALIDATED' | translate}}
</span>
<span class="validated" ng-if="getValidationStatus('validated', document.validation)">
<span class="glyphicon glyphicon-ok"></span>
{{'orders.tables.extra.VALIDATED' | translate}}
</span>
</div>
<div class="invalid-questionaire-comment-container" ng-if="isQuestionaireInvalid[document.idDocument]">
<div class="row">{{'orders.tables.extra.INVALID_QUESTIONAIRE_COMMENT' | translate}}:</div>
<textarea id="invalid-questionaire-comment" class="invalid-questionaire-text col-md-12" ng-model="$parent.$parent.$parent.invalidQuestionaireReason"></textarea>
<div class="row">
<div class="save-invalid-doc-btn btn btn-warning col-md-offset-10 col-md-2"
ng-click="showHideValidationDialog({idDocument: document.idDocument, validationStatus: 'invalid'})">{{'orders.tables.extra.SAVE' | translate}}</div>
<div id="dialog-invalidation-confirm"
dialog
ng-if="isValidationDialogVisible.invalid[document.idDocument]"
on-confirmation="validateQuestionaire"
on-close="showHideValidationDialog"
is-modal="true"
has-buttons="true"
parameters="{idPackage:document.idPackage, idDocument: document.idDocument, validationStatus: 'invalid'}"
title="{{'orders.headers.VALIDATE_QUESTIONAIER' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'orders.messages.VALIDATE_QUESTIONAIER' | translate}} {{'orders.tables.extra.INVALID' | translate}}?</p>
</div>
</div>
</div>
<div class="order-added-comments" class="col-md-12" ng-if="invalidQuestionaireComments[key]">
<h4>{{getInvalidReasonsHeader()}}</h4>
<div class="order-comment-layer reason-comment" ng-repeat="commentObj in invalidQuestionaireComments[key]">
<div class="order-comment-date">
{{commentObj.user}} - {{commentObj.addDate}}
</div>
<div class="order-comment-label">
{{commentObj.comment}}
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,50 @@
<div id="validate-questionaire" ng-controller="validateQuestionnaireCtrl" ng-init="getDocumentsAndQuestionnaireComments()">
<div class="document-package-layer" ng-repeat="(key, packageDocuments) in customerDocuments">
<div class="document-layer row" ng-repeat="document in packageDocuments">
<div class="col-md-6">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
<div class="btn btn-primary">
{{document.documentName}}.{{document.extension}}
</div>
</a>
<div class="document-status">
<span class="not-validated" ng-if="getValidationStatus('not-validated', document.validation)">
<span class="glyphicon glyphicon-time"></span>
{{'orders.tables.extra.NOT_VALIDATED' | translate}}
</span>
<span class="validated" ng-if="getValidationStatus('validated', document.validation)">
<span class="glyphicon glyphicon-ok"></span>
{{'orders.tables.extra.VALIDATED' | translate}}
</span>
<div class="invalid" ng-if="getValidationStatus('invalid', document.validation)">
<span class="glyphicon glyphicon-remove"></span>
{{'orders.tables.extra.INVALID' | translate}}
<span class="questionnaire-invalid-reason">{{invalidQuestionaireReason}}</span>
</div>
</div>
<div class="order-added-comments" class="col-md-12" ng-if="questionnaireCommentsExist">
<h4>{{getInvalidReasonsHeader()}}</h4>
<div class="order-comment-layer reason-comment" ng-repeat="commentObj in invalidQuestionaireComments">
<div class="order-comment-date">
{{commentObj.user}} - {{commentObj.addDate}}
</div>
<div class="order-comment-label">
{{commentObj.comment}}
</div>
</div>
</div>
</div>
<form ng-if="needsUplaod(document.validation)" name="form" class="col-md-4">
<div ngf-drop="uploadFile($file, document.idDocument)"
ng-model="files"
ngf-drag-over-class="'dragover'"
ngf-select="uploadFile($file, document.idDocument)"
ngf-pattern="'.pdf,.docx,.doc,.xlsx,.xls,.odt,.ods'"
ngf-max-size="20MB"
class="drop-box">{{'orders.headers.SELECT_QUESTIONAIRE' | translate}}</div>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,6 @@
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('validateQuestionnaireBrokerTemplate.php');
}else{
require_once('validateQuestionnaireCustomerTemplate.php');
}