545 lines
20 KiB
PHP
545 lines
20 KiB
PHP
<?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;
|
|
}
|
|
}
|