Initial commit
This commit is contained in:
1328
api-wiaas/server/components/v1/orders/InstallationScheduling.php
Normal file
1328
api-wiaas/server/components/v1/orders/InstallationScheduling.php
Normal file
File diff suppressed because it is too large
Load Diff
270
api-wiaas/server/components/v1/orders/OrderActions.php
Normal file
270
api-wiaas/server/components/v1/orders/OrderActions.php
Normal 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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
237
api-wiaas/server/components/v1/orders/OrderDocuments.php
Normal file
237
api-wiaas/server/components/v1/orders/OrderDocuments.php
Normal 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;
|
||||
}
|
||||
}
|
||||
544
api-wiaas/server/components/v1/orders/OrderExtraActions.php
Normal file
544
api-wiaas/server/components/v1/orders/OrderExtraActions.php
Normal 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;
|
||||
}
|
||||
}
|
||||
263
api-wiaas/server/components/v1/orders/OrderHelper.php
Normal file
263
api-wiaas/server/components/v1/orders/OrderHelper.php
Normal 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;
|
||||
}
|
||||
}
|
||||
924
api-wiaas/server/components/v1/orders/OrderProcessHelper.php
Normal file
924
api-wiaas/server/components/v1/orders/OrderProcessHelper.php
Normal 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] : [];
|
||||
}
|
||||
}
|
||||
121
api-wiaas/server/components/v1/orders/OrderTraking.php
Normal file
121
api-wiaas/server/components/v1/orders/OrderTraking.php
Normal 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;
|
||||
}
|
||||
}
|
||||
664
api-wiaas/server/components/v1/orders/OrdersController.php
Normal file
664
api-wiaas/server/components/v1/orders/OrdersController.php
Normal 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');
|
||||
}
|
||||
|
||||
}
|
||||
2357
api-wiaas/server/components/v1/orders/OrdersModel.php
Normal file
2357
api-wiaas/server/components/v1/orders/OrdersModel.php
Normal file
File diff suppressed because it is too large
Load Diff
22
api-wiaas/server/components/v1/orders/OrdersPage.php
Normal file
22
api-wiaas/server/components/v1/orders/OrdersPage.php
Normal 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>
|
||||
88
api-wiaas/server/components/v1/orders/Procurement.php
Normal file
88
api-wiaas/server/components/v1/orders/Procurement.php
Normal 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;
|
||||
}
|
||||
}
|
||||
258
api-wiaas/server/components/v1/orders/SupplierEstimations.php
Normal file
258
api-wiaas/server/components/v1/orders/SupplierEstimations.php
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -0,0 +1,2 @@
|
||||
<div class="order-label">{{'orders.tables.headers.estimatedDeliveryDate' | translate}}: </div>
|
||||
<span>{{ordersInfo.estimatedDeliveryDate}}</span>
|
||||
@@ -0,0 +1 @@
|
||||
<span class="order-info-toggle glyphicon {{getIconStepStatus()}}" ng-click="toggleInfo($event)"></span>
|
||||
@@ -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');
|
||||
}
|
||||
?>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
if($user->getUserType() === USER_TYPES['BROKER']){
|
||||
require_once('validateQuestionnaireBrokerTemplate.php');
|
||||
}else{
|
||||
require_once('validateQuestionnaireCustomerTemplate.php');
|
||||
}
|
||||
Reference in New Issue
Block a user