Initial commit

This commit is contained in:
Senad Uka
2018-06-11 11:09:35 +02:00
commit ed7df7b11f
1954 changed files with 483354 additions and 0 deletions

View File

@@ -0,0 +1,100 @@
<?php
/**
* ShopController controlls the actions for docuemnts
*/
class DocumentsController{
private $model;
function __construct(){
$this->model = new DocumentsModel();
}
/**
* get documents for documents view
* @return json list of documents
*/
public function getDocuments(){
$idDocument = isset($_REQUEST['idDocument']) ? $_REQUEST['idDocument'] : 0;
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
echo json_encode($this->model->getDocuments($idDocument, $idPackage));
}
/**
* get documents and apckages for linking
* @return json a list for documetns and one for packages
*/
public function getDocumentsAndPackages(){
echo json_encode($this->model->getDocumentsAndPackages());
}
/**
* update linking between a package and docuemtns
* @return json update message
*/
public function updatePackageDocuments(){
$idPackage = isset($_REQUEST['idPackage']) ? $_REQUEST['idPackage'] : 0;
$documents = isset($_REQUEST['documents']) ? $_REQUEST['documents'] : '[]';
echo json_encode($this->model->updatePackageDocuments($idPackage, $documents));
}
/**
* get documents types
* @return json a list for document types
*/
public function getDocumentTypes(){
echo json_encode($this->model->getDocumentTypes());
}
public function uploadNewDocument(){
$idDocumentType = isset($_REQUEST['idDocumentType']) ? $_REQUEST['idDocumentType'] : 0;
$documentName = isset($_REQUEST['documentName']) ? $_REQUEST['documentName'] : '';
$file = isset($_FILES['file']) ? $_FILES['file'] : [];
echo json_encode($this->model->uploadNewDocument($idDocumentType, $documentName, $file));
}
public function addNewDocumnetType(){
$documentNewType = isset($_REQUEST['documentNewType']) ? $_REQUEST['documentNewType'] : '';
echo json_encode($this->model->addNewDocumnetType($documentNewType));
}
public function removeDocument(){
$idDocument = isset($_REQUEST['idDocument']) ? $_REQUEST['idDocument'] : 0;
echo json_encode($this->model->removeDocument($idDocument));
}
/**
* include decouments template
*/
public function documentsTemplate(){
global $user;
require_once('templates/DocumentsTemplate.php');
}
/**
* include decouments view template
*/
public function documentsViewTemplate(){
require_once('templates/DocumentsViewTemplate.php');
}
/**
* include decouments view template
*/
public function documentsLinkTemplate(){
require_once('templates/DocumentsLinkTemplate.php');
}
/**
* include decouments view template
*/
public function DocumentsAddTemplate(){
require_once('templates/DocumentsAddTemplate.php');
}
/**
* open documents page
*/
public function showPage(){
require_once('DocumentsPage.php');
}
}

View File

@@ -0,0 +1,332 @@
<?php
/**
* Data manipulation for the docuemnts
*/
class DocumentsModel{
private $specialDocumentTypes = [2, 3, 5, 7, 10];
//orderQuestionaire, configuration, customerAcceptance, OrderAgreement, installationProtocol
/**
* get linked packages to a documnet
* @param INT $idDocument id of the document
* @return HashArray Array of packages for each document
*/
private function getLinkedPackages($idDocument = 0){
global $database;
$data = [];
$whereSql = '';
if(intval($idDocument) !== 0){
$whereSql = " AND d.id=$idDocument";
}
$sql = "SELECT d.id AS idDocument,
p.name AS packageName
FROM ".TABLES['documents']." d
INNER JOIN ".TABLES['rel_package_documents']." rpd
ON rpd.idDocument=d.id
INNER JOIN ".TABLES['packages']." p
ON p.id=rpd.idPackage
WHERE d.uploadedBy IS NULL $whereSql";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data[$row['idDocument']][] = $row;
}
return $data;
}
/**
* get documents for view documetns
* @param INT $idDocument id for the doceument
* @param INT $idPackage id for the pacakge
* @return Array array of documents
*/
public function getDocuments($idDocument, $idPackage){
global $database;
$data = [];
$whereSql = '';
$extraJoin = '';
$idDocument = $database->escapeValue($idDocument);
$idPackage = $database->escapeValue($idPackage);
if(intval($idDocument) !== 0){
$whereSql = " AND d.id=$idDocument";
}
if(intval($idPackage) !== 0){
$extraJoin = " INNER JOIN ".TABLES['rel_package_documents']." rpd
ON rpd.idDocument=d.id AND rpd.idPackage=$idPackage";
}
$linkedPackages = $this->getLinkedPackages($idDocument, $idPackage);
$specialDocumentTypesSql = implode(',', $this->specialDocumentTypes);
$sql = "SELECT d.id AS idDocument,
d.documentName,
d.documentPath,
dt.type AS documentType,
d.extension
FROM ".TABLES['documents']." d
INNER JOIN ".TABLES['document_types']." dt
ON dt.id=d.idDocumentType
$extraJoin
WHERE dt.id NOT IN($specialDocumentTypesSql) $whereSql
ORDER BY documentType, documentName";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
if(isset($linkedPackages[$row['idDocument']])){
$row['packages'] = $linkedPackages[$row['idDocument']];
}
$data[$row['documentType']][] = $row;
}
return $data;
}
/**
* get packages to link to the documents
* @return HashArray array of packages
*/
public function getPackages(){
global $database;
$data = [];
$specialDocumentTypesSql = implode(',', $this->specialDocumentTypes);
$sql = "SELECT p.id AS idPackage,
p.name AS packageName,
c.code AS countryCode,
docs.idDocument,
docs.documentName,
docs.extension,
docs.documentType
FROM ".TABLES['packages']." p
INNER JOIN ".TABLES['countries']." c
ON c.id=p.idCountry
LEFT OUTER JOIN
(
SELECT
rpd.idPackage,
rpd.idDocument,
d.documentName,
d.extension,
dt.type AS documentType
FROM ".TABLES['rel_package_documents']." rpd
INNER JOIN ".TABLES['documents']." d
ON rpd.idDocument=d.id
INNER JOIN ".TABLES['document_types']." dt
ON dt.id=d.idDocumentType
WHERE dt.id NOT IN($specialDocumentTypesSql)
) docs
ON p.id=docs.idPackage
ORDER BY documentType, documentName";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$idPackage = $row['idPackage'];
$packageDetails[$idPackage]['idPackage'] = $idPackage;
$packageDetails[$idPackage]['packageName'] = $row['packageName'];
$packageDetails[$idPackage]['countryCode'] = $row['countryCode'];
unset($row['idPackage']);
unset($row['packageName']);
unset($row['countryCode']);
if(!isset($packageDetails[$idPackage]['documents'])){
$packageDetails[$idPackage]['documents'] = [];
}
if($row['idDocument']){
$packageDetails[$idPackage]['documents'][] = $row;
}
}
foreach($packageDetails as $details) {
$data[] = $details;
}
usort($data, array($this, "comparePackNames"));
return $data;
}
/**
* compare package names and sort them
* @param Array $a first array from all packages with details
* @param Array $b second array from all packages with details
* @return Int < 0 if a is less than b; > 0 if a is greater than b, and 0 if they are equal
*/
private function comparePackNames($a, $b) {
return strcmp($a['packageName'], $b['packageName']);
}
/**
* get documents and packages for link documents view
* @return HashArray array containg the documents and the packages
*/
public function getDocumentsAndPackages(){
global $database;
$data = [];
$specialDocumentTypesSql = implode(',', $this->specialDocumentTypes);
$sql = "SELECT d.id AS idDocument,
d.documentName,
d.extension,
dt.type AS documentType
FROM ".TABLES['documents']." d
INNER JOIN ".TABLES['document_types']." dt
ON d.idDocumentType=dt.id
WHERE dt.id NOT IN ($specialDocumentTypesSql)
ORDER BY documentType, d.documentName";
$data['documents'] = $database->fetchResultArray($sql);
$data['packages'] = $this->getPackages();
return $data;
}
public function updatePackageDocuments($idPackage, $documents){
global $database;
$data = [];
$idPackage = $database->escapeValue($idPackage);
$documents = json_decode($documents);
if(intval($idPackage) == 0){
$data['messages'][] = [
'code' => 'error',
'message' => 'INVALID_PACKAGE'
];
}
$sql = "";
$idsToNotDelete = "AND idDocument NOT IN(";
foreach ($documents as $document) {
$document->idDocument = $database->escapeValue($document->idDocument);
$sql .= "($idPackage, ".$document->idDocument."),";
$idsToNotDelete .= $document->idDocument.",";
}
$sql = rtrim($sql, ',');
$idsToNotDelete = rtrim($idsToNotDelete, ','). ')';
if(!empty($sql)){
$sql = "INSERT IGNORE INTO ".TABLES['rel_package_documents']."
(idPackage, idDocument)
VALUES $sql";
$query = $database->query($sql);
$inserted = $database->affectedRows();
}else{
$inserted = 0;
$idsToNotDelete = "";
}
$sqlDel ="DELETE FROM ".TABLES['rel_package_documents']."
WHERE idPackage=$idPackage $idsToNotDelete";
$query = $database->query($sqlDel);
$deleted = $database->affectedRows();
if($inserted > 0 || $deleted >0){
$data['messages'][] = [
'code' => 'success',
'message' => 'DOCUMENTS_LINKED_TO_PACKAGE'
];
}else{
$data['messages'][] = [
'code' => 'warning',
'message' => 'NO_CHANGES'
];
}
return $data;
}
public function getDocumentTypes(){
global $database;
$data = [];
$sql = "SELECT dt.id AS idDocumentType,
dt.type,
dt.isSpecialType
FROM ".TABLES['document_types']." dt
ORDER BY dt.type ASC";
$query = $database->query($sql);
while($row = $database->fetchArray($query)){
$data[] = $row;
}
return $data;
}
public function uploadNewDocument($idDocumentType, $documentName, $file){
global $database;
$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;
}
$specialDocTypes = implode(',', $this->specialDocumentTypes);
$sql = "SELECT d.id
FROM ".TABLES['documents']." d
WHERE d.documentName='$documentName' AND d.id NOT IN($specialDocTypes)";
$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;
}
$data['messages'][] = [
'code' => 'success',
'message' => 'DOCUMENT_UPLOADED'
];
return $data;
}
public function addNewDocumnetType($documentNewType){
$fileManager = new FileManager();
return $fileManager->addNewDocumnetType($documentNewType);
}
public function removeDocument($idDocument){
global $database;
$fileManager = new FileManager();
$data = $fileManager->removeDocument($idDocument);
foreach ($data['messages'] as $messageObj) {
if ($messageObj['code'] === 'success') {
$sqlUnlink = "
DELETE
FROM ".TABLES['rel_package_documents']."
WHERE idDocument=$idDocument";
$query = $database->query($sqlUnlink);
}
}
return $data;
}
}

View File

@@ -0,0 +1,9 @@
<script src="<?php echo PATH_JS_COMPONENTS.'documents/documents.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'documents/documents-view.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'documents/documents-link.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<script src="<?php echo PATH_JS_COMPONENTS.'documents/documents-add.directive.js?v='.APPLICATION_VERSION;?>" type="text/javascript"></script>
<div id="documents-module" class="container-fluid col-md-12">
<h1>{{ 'documents.TITLE' | translate }}</h1>
<documents ng-controller="documentsCtrl"></documents>
</div>

View File

@@ -0,0 +1,5 @@
<button type="button"
id="documents-add"
subModule="documentsAdd"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'documents.buttons.ADD_DOCUMENTS' | translate }}</button>

View File

@@ -0,0 +1,7 @@
<div class="row">
<div class="col-md-12"
id="documents-add-layer"
ng-if="isSubmoduleVisible('documentsAdd')">
<documents-add ng-controller="documentsAddCtrl" ng-init="getDocumentTypes()"></documents-add>
</div>
</div>

View File

@@ -0,0 +1,56 @@
<div class="documents-add-layer row">
<div class="col-md-3">
<div class="documetns-types">
<div class="documents-header">
{{'documents.headers.DOCUMENT_TYPES' | translate}}
</div>
<div class="document-types-list">
<div class="document-type-row {{getTypeRowClass(docType)}}"
ng-click="selectType(docType)"
ng-repeat="docType in documentTypes">
<span ng-if="hasInfo(docType)">*</span>
{{docType.type}}
</div>
</div>
<div class="document-type-row add-type-layer">
<input type="text"
ng-model="documentNewType"
placeholder="{{'documents.headers.TYPE' | translate}}"/>
<div ng-click="addNewType()" class="btn btn-primary">
{{'documents.buttons.ADD_TYPE' | translate}}
</div>
</div>
</div>
</div>
<form id="upload-new-doc-container" name="form" class="col-md-4">
<div>
<label>{{'documents.headers.DOCUMENT_NAME' | translate}}: </label>
<input id="new-doc-name"
type="text"
placeholder="{{'documents.headers.DOCUMENT_NAME' | translate}}"
ng-model="documentName" />
</div>
<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'"
ngf-max-size="20MB"
class="drop-box">{{'documents.headers.SELECT_DOCUMENT' | translate}}</div>
</form>
</div>
<div class="row">
<div class="col-md-3">
<div ng-if="hasInfo(selectedType)" class="alert alert-info doc-type-info">
<span class="glyphicon glyphicon-info-sign"></span>
{{selectedType.type}}: {{ 'documents.messages.TYPE_INFO_' + selectedType.idDocumentType | translate }}
</div>
<div class="alert alert-info doc-type-info">
<span class="glyphicon glyphicon-info-sign"></span>
{{ 'documents.messages.TYPE_INFO' | translate }}
</div>
</div>
</div>

View File

@@ -0,0 +1,71 @@
<div class="documents-link-layer row">
<div class="all-packages-layer col-md-4">
<div class="documents-container">
<div class="documents-header">{{ 'documents.headers.SELECT_PACKAGE' | translate }}</div>
<div class="documents-list">
<div ng-click="selectPackage(package)" class="package-layer {{getPackageClass(package)}}" ng-repeat="package in packages">
<span class="flag-icon flag-icon-{{package.countryCode}}"></span> {{package.packageName}}
</div>
</div>
</div>
</div>
<div class="documents-link-area col-md-8">
<div class="documents-big-container col-md-12">
<div class="col-md-6">
<div id="linked-documents"
class="documents-container"
data-drop="true"
jqyoui-droppable="{onDrop:'documentDropped(\'linked-documents\')'}">
<div class="documents-header">{{ 'documents.headers.LINKED_DOCUMENTS' | translate }}</div>
<div id='linked-documents-list' class="documents-list">
<div class="linked-documents-layer document-row linked"
ng-repeat="document in selectedPackage.documents"
data-drag="true"
id-document="{{document.idDocument}}"
drop-to="all-documents"
jqyoui-draggable="{animate:true, onStart:'documentDragStart(\'linked-documents-list\')', onStop:'documentDragStop(\'linked-documents-list\')', scroll: false}"
data-jqyoui-options="{revert: true}">
<div class="document-icon-layer">
<span class="{{document.extension}} document-icon glyphicon glyphicon-file"></span>
<div class="document-icon-text">{{document.extension}}</div>
</div>
({{document.documentType}}) {{document.documentName}}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div id="all-ducuments"
class="documents-container"
data-drop="true"
jqyoui-droppable="{onDrop:'documentDropped(\'all-documents\')'}">
<div class="documents-header">{{ 'documents.headers.ALL_DOCUMENTS' | translate }}</div>
<div id='all-documents-list' class="documents-list">
<div ng-if="document.isNotLinked"
class="all-documents-layer document-row not-linked"
ng-repeat="document in documents"
data-drag="true"
id-document="{{document.idDocument}}"
drop-to="linked-documents"
jqyoui-draggable="{animate:true, onStart:'documentDragStart(\'all-documents-list\')', onStop:'documentDragStop(\'all-documents-list\')', scroll: false}"
data-jqyoui-options="{revert: true}">
<div class="document-icon-layer">
<span class="{{document.extension}} document-icon glyphicon glyphicon-file"></span>
<div class="document-icon-text">{{document.extension}}</div>
</div>
({{document.documentType}}) {{document.documentName}}
</div>
</div>
</div>
</div>
</div>
</div>
<div class="documents-link-buttons col-md-12">
<div class="btn btn-primary" ng-click="updatePackageDocuments()">
{{ 'documents.buttons.SAVE' | translate }}
</div>
</div>
</div>

View File

@@ -0,0 +1,24 @@
<button type="button"
id="documents-view"
subModule="documentsView"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'documents.buttons.VIEW_DOCUMENTS' | translate }}</button>
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('AddDocumentsButton.php');
require_once('LinkDocumentsButton.php');
}
?>
<div class="row">
<div class="col-md-12"
id="documents-view-layer"
ng-if="isSubmoduleVisible('documentsView')">
<documents-view ng-controller="documentsViewCtrl" ng-init="getDocuments()"></documents-view>
</div>
</div>
<?php
if($user->getUserType() === USER_TYPES['BROKER']){
require_once('AddDocumentsLayer.php');
require_once('LinkDocumentsLayer.php');
}
?>

View File

@@ -0,0 +1,46 @@
<div class="documents-view-layer row">
<div class="document-categ col-md-12" ng-repeat="(category, categDocuments) in documents">
<h3>{{category}}</h3>
<div class="document-layer row" ng-repeat="document in categDocuments">
<div class="document-icon-layer col-md-1 col-sm-1">
<span class="{{document.extension}} document-icon glyphicon glyphicon-file"></span>
<div class="document-icon-text">{{document.extension}}</div>
</div>
<div class="document-name col-md-3 col-sm-3">
{{document.documentName}}.{{document.extension}}
</div>
<div class="packages-link col-md-6 col-sm-4">
<div ng-if="document.packages.length">
{{ 'documents.headers.LINKED_PACKAGES' | translate }} <span ng-repeat="package in document.packages">{{package.packageName}}, </span>
</div>
</div>
<div class="document-download col-md-1 col-sm-2">
<a href="utils/api/downloadFile?idDocument={{document.idDocument}}&fileName={{document.documentName}}.{{document.extension}}">
<div class="btn btn-primary">
<span class="glyphicon glyphicon-download"></span> {{ 'documents.buttons.DOWNLOAD' | translate }}
</div>
</a>
</div>
<div class="document-delete col-md-1 col-sm-2">
<div class="btn btn-danger" ng-click="showHideRemoveDialog(document)">
<span class="glyphicon glyphicon-remove"></span> {{ 'documents.buttons.REMOVE' | translate }}
</div>
</div>
</div>
</div>
</div>
<div id="dialog-confirm-remove"
dialog
ng-if="isRemoveDialogVisible"
on-confirmation="removeDocument"
on-close="showHideRemoveDialog"
is-modal="true"
has-buttons="true"
parameters="selectedDocument"
title="{{'documents.headers.REMOVE_DOCUMENT' | translate}}">
<p><span class="glyphicon glyphicon-warning-sign"></span>{{'documents.messages.REMOVE_DOCUMENT' | translate}} {{selectedDocument.documentName}}.{{selectedDocument.extension}}?</p>
</div>

View File

@@ -0,0 +1,5 @@
<button type="button"
id="documents-link"
subModule="documentsLink"
class="btn btn-default"
ng-click="setSubModule($event)">{{ 'documents.buttons.LINK_DOCUMENT' | translate }}</button>

View File

@@ -0,0 +1,7 @@
<div class="row">
<div class="col-md-12"
id="documents-link-layer"
ng-if="isSubmoduleVisible('documentsLink')">
<documents-link ng-controller="documentsLinkCtrl" ng-init="getDocumentsAndPackages()"></documents-link>
</div>
</div>