Files
old-wiaas-legacy/api-wiaas/server/components/v2/orders/OrderExtraActions.php

1020 lines
37 KiB
PHP
Raw Normal View History

2018-06-11 11:09:35 +02:00
<?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;
/**
* add null values for products estimations in an order
* @param INT $idOrder id of the order
* @param INT $idPackage id of the order
*/
public function addStartEstimatisonForProducts($idOrder, $idPackage){
global $database;
$installation = 2;
$sql = "INSERT INTO ".TABLES['rel_order_products_estimation']."
(idOrder, idPackage, idProduct)
SELECT rop.idOrder, rop.idPackage, rpp.idProduct
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 AND rop.idPackage=$idPackage AND scp.idProductCategory!=$installation";
$query = $database->query($sql);
return $database->affectedRows();
}
/**
* 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;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$documentType = $database->escapeValue($documentType);
$data = [];
$whereSql = "";
$documents = $this->getSupplierDocuments($idOrder, $idPackage, $documentType);
if($user->getUserType() === USER_TYPES['SUPPLIER']){
$whereSql = " AND s.idUser=".$user->getUserId();
}
$sql = "SELECT s.id AS idSupplier,
s.name AS supplierName
FROM ".TABLES['rel_order_products_estimation']." rope
INNER JOIN ".TABLES['suppliers_countries_products']." scp
ON scp.idProduct=rope.idProduct
INNER JOIN ".TABLES['suppliers']." s
ON s.id=scp.idSupplier
WHERE idOrder=$idOrder AND idPackage=$idPackage AND scp.idProductCategory!=".self::ID_INSTALLATION_CATEGORY." $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']] : [];
}
return $data;
}
/**
* get estimations for products
* @param INT $idOrder id for the order
* @param INT $idPackage id for the order
* @return Array Array of products estimations
*/
public function getProductsEstimations($idOrder, $idPackage){
global $database, $user;
$idInstallationCategory = 2;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$data = [];
$whereSql = "";
$documents = $this->getSupplierDocuments($idOrder, $idPackage);
$trackingInfo = $this->getTrackingInfo($idOrder, $idPackage);
if($user->getUserType() === USER_TYPES['SUPPLIER']){
$whereSql = " AND s.idUser=".$user->getUserId();
}
$sql = "SELECT rope.idProduct,
rope.estimatedDate,
rope.confirmedDate,
s.id AS idSupplier,
s.name AS supplierName,
scp.productName
FROM ".TABLES['rel_order_products_estimation']." rope
INNER JOIN ".TABLES['suppliers_countries_products']." scp
ON scp.idProduct=rope.idProduct
INNER JOIN ".TABLES['suppliers']." s
ON s.id=scp.idSupplier
WHERE idOrder=$idOrder AND idPackage=$idPackage AND scp.idProductCategory!=$idInstallationCategory $whereSql
ORDER BY s.id,
scp.productName";
$query = $database->query($sql);
if($database->numRows($query) === 0){
if($user->getUserType() === USER_TYPES['SUPPLIER']) {
return $data;
}
$addedStartValues = $this->addStartEstimatisonForProducts($idOrder, $idPackage);
if($addedStartValues > 0){
return $this->getProductsEstimations($idOrder, $idPackage);
}else{
return $data;
}
}
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']]['estimations'][] = $row;
$data[$row['supplierName']]['trackings'] = isset($trackingInfo[$row['idSupplier']]) ? $trackingInfo[$row['idSupplier']] : [];
}
return $data;
}
private function isProductOwner($idProduct){
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
INNER JOIN ".TABLES['suppliers_countries_products']." scp
ON scp.idSupplier=s.id
WHERE s.idUser=".$user->getUserId();
$query = $database->query($sql);
return $database->numRows($query) > 0;
}
return false;
}
private function getTrackingInfo($idOrder, $idPackage) {
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
AND roso.idPackage = $idPackage";
$query = $database->query($sql);
while($row = $database->fetchArray($query)) {
$data[$row['idSupplier']][] = $row;
}
return $data;
}
/**
* update dates for products in an order
* @param INT $idOrder id for the order
* @param INT $idPackage id for the package
* @param INT $idProduct id for the product
* @param String $estimatedDate estimated date
* @param String $confirmedDate confirmed date
* @return Array update message
*/
public function updateProductEstimation($idOrder, $idPackage, $idProduct, $estimatedDate, $confirmedDate){
global $database;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$idProduct = $database->escapeValue($idProduct);
$estimatedDate = $database->escapeValue($estimatedDate);
$confirmedDate = $database->escapeValue($confirmedDate);
$data = [];
if(!$this->isProductOwner($idProduct)){
$data['messages'][] = [
'code' => 'error',
'message' => 'NOT_OWNER_OF_PROD'
];
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_products_estimation']."
SET estimatedDate=$estimatedDate,
confirmedDate=$confirmedDate
WHERE idOrder=$idOrder AND idPackage=$idPackage AND idProduct=$idProduct";
$query = $database->query($sql);
if($database->affectedRows() > 0){
$data['messages'][] = [
'code' => 'success',
'message' => 'PROD_ESTIMATION_UPDATED'
];
}else{
$data['messages'][] = [
'code' => 'warning',
'message' => 'NO_CHANGES'
];
}
return $data;
}
/**
* add tracking number and url for order/package/supplier
* @param INT $idOrder id for the order
* @param INT $idPackage id for the package
* @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, $idPackage, $idSupplier, $trackingNumber, $trackingUrl) {
global $database;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$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,
idPackage,
idSupplier,
trackingNumber,
trackingUrl
)
VALUES
($idOrder, $idPackage, $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;
}
/**
* 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 documents grouped by suppliers
* @param INT $idOrder id for the order
* @param INT $idPackage id for the package
* @param String $documentType the type of the document
* @return Array list of documents
*/
private function getSupplierDocuments($idOrder, $idPackage, $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,
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.uploadedBy
WHERE rod.idOrder=$idOrder AND rod.idPackage=$idPackage $extraWhere";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data[$row['supplierName']][] = $row;
}
return $data;
}
/**
* save the installation company
* @param [type] $idOrder [description]
* @param [type] $idPackage [description]
* @param [type] $idInstallation [description]
* @return [type] [description]
*/
public function saveInstallationCompany($idOrder, $idPackage, $idInstallation) {
global $database;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$idInstallation = $database->escapeValue($idInstallation);
$installationScheduling = new InstallationScheduling();
if(!$idOrder || !$idPackage || !$idInstallation) {
$data['messages'][] = [
'code' => 'error',
'message' => 'DATA_NOT_SET'
];
return $data;
}
$sqlSelect = "
SELECT idProduct
FROM ".TABLES['order_selections']."
WHERE idOrder = $idOrder
AND idPackage = $idPackage
";
$result = $database->query($sqlSelect);
if($database->numRows($result) > 0) {
$sql = "
UPDATE
".TABLES['order_selections']."
SET
idProduct = $idInstallation
WHERE idOrder = $idOrder AND idPackage = $idPackage";
} else {
$sql = "
INSERT INTO ".TABLES['order_selections']."
(idOrder, idPackage, idProduct, selectionFor)
VALUES
($idOrder, $idPackage, $idInstallation, 'installation')
";
}
$result = $database->query($sql);
$data['messages'][] = $installationScheduling->changeInstallationCompany($idOrder, $idPackage, $idInstallation);
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 customer questionaires for a specific order
* @param INT $idOrder id for the order
* @param String $documentType the type of the documents needed - Order Questionaire or Installation protocol
* @return Array array of documents
*/
public function getOrderDocumentsPerType($idOrder, $documentType){
global $database, $user;
$idOrder = $database->escapeValue($idOrder);
$documentType = $database->escapeValue($documentType);
$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,
dt.folderName AS documentTypeName,
rod.validation,
rod.idOrder,
rod.idPackage
FROM ".TABLES['documents']." d
INNER JOIN ".TABLES['rel_order_documents']." rod
ON rod.idDocument=d.id
INNER JOIN ".TABLES['document_types']." dt
ON d.idDocumentType=dt.id
WHERE d.idDocumentType=$idDocumentType
AND rod.idOrder=$idOrder";
$query = $database->query($sql);
while($row = $database->fetchArray($query)) {
$row['isUploadedByMe'] = $user->getUserId() === $row['uploadedBy'];
unset($row['uploadedBy']);
$data['documents'][$row['idOrder'].'-'.$row['idPackage']][] = $row;
}
return $data;
}
/**
* send mail to broker in case of new quesionnaire upload
* @param INT $idOrder id of the order
* @param INT $idDocument id of the document
* @return array mail send message
*/
private function sendQuesionnaireUploadMail($idOrder, $idDocument){
global $database;
$sqlCustomerInfo = "
SELECT o.orderNumber,
GROUP_CONCAT(DISTINCT b.mail) AS mailList
FROM ".TABLES['orders']." o
INNER JOIN ".TABLES['brokers']." b
ON CASE WHEN o.assignedTo is NOT NULL THEN b.id=o.assignedTo ELSE 1=1 END
WHERE o.id=$idOrder AND b.mail is NOT NULL
GROUP BY o.id";
$query = $database->query($sqlCustomerInfo);
$brokerInfo = $database->fetchArray($query);
$sqlDocInfo = "
SELECT d.id AS idDocument,
d.documentName,
d.extension
FROM ".TABLES['documents']." d
WHERE d.id=$idDocument
LIMIT 1";
$query = $database->query($sqlDocInfo);
$documentInfo = $database->fetchArray($query);
$params = [
'url' => WIAAS_URL.'/api-wiaas/utils/api/downloadFile?idDocument='.$documentInfo['idDocument'].'&fileName='.$documentInfo['documentName'].'.'.$documentInfo['extension'],
'ordersUrl' => WIAAS_URL.'/api-wiaas/orders?subModule=orders_steps&idOrder='.$idOrder.'&orderNumber='.$brokerInfo['orderNumber'],
'orderNumber' => $brokerInfo['orderNumber'],
'idOrder' => $idOrder
];
$mailList = trim($brokerInfo['mailList'], ',');
$mailList = explode(',', $mailList);
$response = Mail::sendMail($mailList, 'Modified questionaire uploaded', 'reUploadQuestionnaireTemplate.php', $params);
if($response){
return [
'code' => 'success',
'message' => 'RE_UPLOAD_MAIL'
];
}
return [
'code' => 'error',
'message' => 'ERROR_MAIL_SENT'
];
}
/**
* upload again quesionnaire
* @param INT $idOrder id for the order
* @param INT $idPackage id for the package
* @param INT $idDocument id for the document
* @param file $file file to be uploaded
* @return Array update message
*/
public function reUploadQuestionaire($idOrder, $idPackage, $idDocument, $file){
global $database, $user;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$idDocument = $database->escapeValue($idDocument);
$documentName = 'customerQuestionaire_'.$idOrder.'_'.$idPackage.'_'.date('Y_m_d');
$fileManager = new FileManager();
$data = $fileManager->updateDocument($idDocument, $file, $documentName);
if(isset($data['messages'])){
return $data;
}
$idDocument = $data['idDocument'];
$sql = "UPDATE ".TABLES['rel_order_documents']."
SET validation='not-validated'
WHERE idOrder=$idOrder AND idPackage=$idPackage AND idDocument=$idDocument";
$query = $database->query($sql);
if($database->affectedRows() > 0){
$data['messages'][] = $this->sendQuesionnaireUploadMail($idOrder, $idDocument);
$data['messages'][] = [
'code' => 'success',
'message' => 'FILE_UPLOADED'
];
}else{
$data['messages'][] = [
'code' => 'error',
'message' => 'NOT_UPLOADED'
];
}
return $data;
}
/**
* get comments by type e.g stepComment, invalidQuestionaireComment, ...
* @param Int $idOrder the id of the order
* @param Int $idPackage the id of the package
* @param Int $idProcessStep the id of the process step
* @param String $type the type of the comment: stepComment, invalidQuestionaireComment
* @return Array the comments wanted
*/
public function getCommentsByType($idOrder, $idPackage, $idProcessStep, $type) {
global $database;
$idOrder = $database->escapeValue($idOrder);
$idPackage = $database->escapeValue($idPackage);
$idProcessStep = $database->escapeValue($idProcessStep);
$type = $database->escapeValue($type);
$data = [];
if(!$idOrder) {
$data['messages'][] = [
'code' => 'error',
'message' => 'ORDER_ID_MISSING'
];
}
if(!$idProcessStep) {
$data['messages'][] = [
'code' => 'error',
'message' => 'PROCESS_STEP_MISSING'
];
}
if(!$type) {
$data['messages'][] = [
'code' => 'error',
'message' => 'COMMENT_TYPE_MISSING'
];
}
if(array_key_exists('messages', $data) && count($data['messages'])) {
return $data;
}
$sql = "
SELECT rsc.comment,
DATE_FORMAT(rsc.addDate, '%D %b, %y') as addDate,
u.username AS user,
rsc.idOrder,
rsc.idPackage
FROM ".TABLES['rel_step_comments']." rsc
INNER JOIN ".TABLES['users']." u
ON u.id = rsc.idUser
WHERE rsc.idOrder=$idOrder
AND rsc.idProcessStep=$idProcessStep
AND rsc.type='$type'
";
$query = $database->query($sql);
while($row = $database->fetchArray($query)) {
$data[$row['idOrder'].'-'.$row['idPackage']][] = $row;
}
return $data;
}
}