vtigerossez/modules/Import/controllers/Import_Index_Controller.php

353 lines
13 KiB
PHP

<?php
/*+***********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*************************************************************************************/
require_once 'modules/Import/models/Import_Map.php';
require_once 'modules/Import/resources/Utils.php';
require_once 'modules/Import/ui/Viewer.php';
class Import_Index_Controller {
static $_cached_module_meta;
public function __construct() {
}
private function isEditableField($fieldInstance) {
if(((int)$fieldInstance->getDisplayType()) === 2 ||
in_array($fieldInstance->getPresence(), array(1,3)) ||
strcasecmp($fieldInstance->getFieldDataType(),"autogenerated") ===0 ||
strcasecmp($fieldInstance->getFieldDataType(),"id") ===0 ||
$fieldInstance->isReadOnly() == true ||
$fieldInstance->getUIType() == 70 ||
$fieldInstance->getUIType() == 4) {
return false;
}
return true;
}
public function getAccessibleFields($moduleName) {
global $current_user;
if(empty(self::$_cached_module_meta[$moduleName][$current_user->id])) {
$moduleHandler = vtws_getModuleHandlerFromName($moduleName, $current_user);
self::$_cached_module_meta[$moduleName][$current_user->id] = $moduleHandler->getMeta();
}
$meta = self::$_cached_module_meta[$moduleName][$current_user->id];
$moduleFields = $meta->getModuleFields();
$accessibleFields = array();
foreach($moduleFields as $fieldName => $fieldInstance) {
if($fieldInstance->getPresence() === 1) {
continue;
}
$accessibleFields[$fieldName] = $fieldInstance;
}
return $accessibleFields;
}
public function getMergableFields($moduleName) {
$accessibleFields = $this->getAccessibleFields($moduleName);
$mergableFields = array();
foreach($accessibleFields as $fieldName => $fieldInstance) {
if($fieldInstance->getPresence() === 1) {
continue;
}
// We need to avoid Last Modified by or any such User reference field
// for now as Query Generator is not handling it well enough.
// The case in which query generator is failing to generate right query is,
// Assigned User field is not there either in the selected fields list or in the conditions
// and condition is added on the User reference field
// TODO - Cleanup this once Query Generator support is corrected
if($fieldInstance->getFieldDataType() == 'reference') {
$referencedModules = $fieldInstance->getReferenceList();
if($referencedModules[0] == 'Users') {
continue;
}
}
$mergableFields[$fieldName] = $fieldInstance;
}
return $mergableFields;
}
public function getMandatoryFields($moduleName) {
$focus = CRMEntity::getInstance($moduleName);
if(method_exists($focus, 'getMandatoryImportableFields')) {
$mandatoryFields = $focus->getMandatoryImportableFields();
} else {
$moduleFields = $this->getAccessibleFields($moduleName);
$mandatoryFields = array();
foreach($moduleFields as $fieldName => $fieldInstance) {
if($fieldInstance->isMandatory()
&& $fieldInstance->getFieldDataType() != 'owner'
&& $this->isEditableField($fieldInstance)) {
$mandatoryFields[$fieldName] = getTranslatedString($fieldInstance->getFieldLabelKey(), $moduleName);
}
}
}
return $mandatoryFields;
}
public function getImportableFields($moduleName) {
$focus = CRMEntity::getInstance($moduleName);
if(method_exists($focus, 'getImportableFields')) {
$importableFields = $focus->getImportableFields();
} else {
$moduleFields = $this->getAccessibleFields($moduleName);
$importableFields = array();
foreach($moduleFields as $fieldName => $fieldInstance) {
if(($this->isEditableField($fieldInstance)
&& ($fieldInstance->getTableName() != 'vtiger_crmentity' || $fieldInstance->getColumnName() != 'modifiedby')
) || ($fieldInstance->getUIType() == '70' && $fieldName != 'modifiedtime')) {
$importableFields[$fieldName] = $fieldInstance;
}
}
}
return $importableFields;
}
public function getEntityFields($moduleName) {
$moduleFields = $this->getAccessibleFields($moduleName);
$entityColumnNames = vtws_getEntityNameFields($moduleName);
$entityNameFields = array();
foreach($moduleFields as $fieldName => $fieldInstance) {
$fieldColumnName = $fieldInstance->getColumnName();
if(in_array($fieldColumnName, $entityColumnNames)) {
$entityNameFields[$fieldName] = $fieldInstance;
}
}
return $entityNameFields;
}
public static function loadBasicSettings($userInputObject, $user) {
$moduleName = $userInputObject->get('module');
$indexController = new Import_Index_Controller();
$viewer = new Import_UI_Viewer();
$viewer->assign('FOR_MODULE', $moduleName);
$viewer->assign('SUPPORTED_FILE_TYPES', Import_Utils::getSupportedFileExtensions());
$viewer->assign('SUPPORTED_FILE_ENCODING', Import_Utils::getSupportedFileEncoding());
$viewer->assign('SUPPORTED_DELIMITERS', Import_Utils::getSupportedDelimiters());
$viewer->assign('AUTO_MERGE_TYPES', Import_Utils::getAutoMergeTypes());
$viewer->assign('AVAILABLE_FIELDS', $indexController->getMergableFields($moduleName));
$viewer->assign('ENTITY_FIELDS', $indexController->getEntityFields($moduleName));
$viewer->assign('ERROR_MESSAGE', $userInputObject->get('error_message'));
$viewer->display('ImportBasic.tpl');
}
public static function loadAdvancedSettings($userInputObject, $user) {
global $current_user;
$moduleName = $userInputObject->get('module');
$indexController = new Import_Index_Controller();
$fileReader = Import_Utils::getFileReader($userInputObject, $current_user);
if($fileReader == null) {
$userInputObject->set('error_message', getTranslatedString('LBL_INVALID_FILE', 'Import'));
Import_Index_Controller::loadBasicSettings($userInputObject, $user);
exit;
}
$hasHeader = $fileReader->hasHeader();
$rowData = $fileReader->getFirstRowData($hasHeader);
$autoMerge = $userInputObject->get('auto_merge');
if(!$autoMerge) {
$userInputObject->set('merge_type', 0);
$userInputObject->set('merge_fields', '');
}
$viewer = new Import_UI_Viewer();
$viewer->assign('FOR_MODULE', $moduleName);
$viewer->assign('AVAILABLE_FIELDS', $indexController->getImportableFields($moduleName));
$viewer->assign('HAS_HEADER', $hasHeader);
$viewer->assign('ROW_1_DATA', $rowData);
$viewer->assign('USER_INPUT', $userInputObject);
$viewer->assign('ENCODED_MANDATORY_FIELDS',
Zend_Json::encode($indexController->getMandatoryFields($moduleName)));
$viewer->assign('SAVED_MAPS', Import_Map::getAllByModule($moduleName));
$viewer->assign('USERS_LIST', Import_Utils::getAssignedToUserList($moduleName));
$viewer->assign('GROUPS_LIST', Import_Utils::getAssignedToGroupList($moduleName));
$viewer->display('ImportAdvanced.tpl');
}
public static function validateFileUpload($userInputObject) {
global $current_user;
$uploadMaxSize = Import_Utils::getMaxUploadSize();
$importDirectory = Import_Utils::getImportDirectory();
$temporaryFileName = Import_Utils::getImportFilePath($current_user);
if(!is_uploaded_file($_FILES['import_file']['tmp_name'])) {
$userInputObject->set('error_message', getTranslatedString('LBL_FILE_UPLOAD_FAILED', 'Import'));
return false;
}
if ($_FILES['userfile']['size'] > $uploadMaxSize) {
$userInputObject->set('error_message', getTranslatedString('LBL_IMPORT_ERROR_LARGE_FILE', 'Import').
' $uploadMaxSize.'.getTranslatedString('LBL_IMPORT_CHANGE_UPLOAD_SIZE', 'Import'));
return false;
}
if(!is_writable($importDirectory)) {
$userInputObject->set('error_message', getTranslatedString('LBL_IMPORT_DIRECTORY_NOT_WRITABLE', 'Import'));
return false;
}
$fileCopied = move_uploaded_file($_FILES['import_file']['tmp_name'], $temporaryFileName);
if(!$fileCopied) {
$userInputObject->set('error_message', getTranslatedString('LBL_IMPORT_FILE_COPY_FAILED', 'Import'));
return false;
}
$fileReader = Import_Utils::getFileReader($userInputObject, $current_user);
if($fileReader == null) {
$userInputObject->set('error_message', getTranslatedString('LBL_INVALID_FILE', 'Import'));
return false;
}
$hasHeader = $fileReader->hasHeader();
$firstRow = $fileReader->getFirstRowData($hasHeader);
if($firstRow === false) {
$userInputObject->set('error_message', getTranslatedString('LBL_NO_ROWS_FOUND', 'Import'));
return false;
}
return true;
}
public static function undoLastImport($userInputObject, $user) {
$adb = PearDatabase::getInstance();
$moduleName = $userInputObject->get('module');
$ownerId = $userInputObject->get('foruser');
$owner = new Users();
$owner->id = $ownerId;
$owner->retrieve_entity_info($ownerId, 'Users');
$dbTableName = Import_Utils::getDbTableName($owner);
if(!is_admin($user) && $user->id != $owner->id) {
$viewer = new Import_UI_Viewer();
$viewer->display('OperationNotPermitted.tpl', 'Vtiger');
exit;
}
$result = $adb->query("SELECT recordid FROM $dbTableName WHERE status = ". Import_Data_Controller::$IMPORT_RECORD_CREATED
." AND recordid IS NOT NULL");
$noOfRecords = $adb->num_rows($result);
$noOfRecordsDeleted = 0;
for($i=0; $i<$noOfRecords; ++$i) {
$recordId = $adb->query_result($result, $i, 'recordid');
if(isRecordExists($recordId) && isPermitted($moduleName, 'Delete', $recordId) == 'yes') {
$focus = CRMEntity::getInstance($moduleName);
$focus->id = $recordId;
$focus->trash($moduleName, $recordId);
$noOfRecordsDeleted++;
}
}
$viewer = new Import_UI_Viewer();
$viewer->assign('FOR_MODULE', $moduleName);
$viewer->assign('TOTAL_RECORDS', $noOfRecords);
$viewer->assign('DELETED_RECORDS_COUNT', $noOfRecordsDeleted);
$viewer->display('ImportUndoResult.tpl');
}
public static function deleteMap($userInputObject, $user) {
$adb = PearDatabase::getInstance();
$moduleName = $userInputObject->get('module');
$mapId = $userInputObject->get('mapid');
Import_Map::markAsDeleted($mapId);
$viewer = new Import_UI_Viewer();
$viewer->assign('FOR_MODULE', $moduleName);
$viewer->assign('SAVED_MAPS', Import_Map::getAllByModule($moduleName));
echo $viewer->fetch('Import_Saved_Maps.tpl');
}
public static function process($requestObject, $user) {
$moduleName = $requestObject->get('module');
$mode = $requestObject->get('mode');
if($mode == 'undo_import') {
Import_Index_Controller::undoLastImport($requestObject, $user);
exit;
} elseif($mode == 'listview') {
Import_ListView_Controller::render($requestObject, $user);
exit;
} elseif($mode == 'delete_map') {
Import_Index_Controller::deleteMap($requestObject, $user);
exit;
} elseif($mode == 'clear_corrupted_data') {
Import_Utils::clearUserImportInfo($user);
} elseif($mode == 'cancel_import') {
$importId = $requestObject->get('import_id');
$importInfo = Import_Queue_Controller::getImportInfoById($importId);
if($importInfo != null) {
if($importInfo['user_id'] == $user->id || is_admin($user)) {
$importuser = new Users();
$importuser->id = $importInfo['user_id'];
$importuser->retrieve_entity_info($importInfo['user_id'], 'Users');
$importDataController = new Import_Data_Controller($importInfo, $importuser);
$importStatusCount = $importDataController->getImportStatusCount();
$importDataController->finishImport();
Import_Controller::showResult($importInfo, $importStatusCount);
}
exit;
}
}
// Check if import on the module is locked
$lockInfo = Import_Lock_Controller::isLockedForModule($moduleName);
if($lockInfo != null) {
$lockedBy = $lockInfo['userid'];
if($user->id != $lockedBy && !is_admin($user)) {
Import_Utils::showImportLockedError($lockInfo);
exit;
} else {
if($mode == 'continue_import' && $user->id == $lockedBy) {
$importController = new Import_Controller($requestObject, $user);
$importController->triggerImport(true);
} else {
$importInfo = Import_Queue_Controller::getImportInfoById($lockInfo['importid']);
$lockOwner = $user;
if($user->id != $lockedBy) {
$lockOwner = new Users();
$lockOwner->id = $lockInfo['userid'];
$lockOwner->retrieve_entity_info( $lockInfo['userid'], 'Users');
}
Import_Controller::showImportStatus($importInfo, $lockOwner);
}
exit;
}
}
if(Import_Utils::isUserImportBlocked($user)) {
$importInfo = Import_Queue_Controller::getUserCurrentImportInfo($user);
if($importInfo != null) {
Import_Controller::showImportStatus($importInfo, $user);
exit;
} else {
Import_Utils::showImportTableBlockedError($moduleName, $user);
exit;
}
}
Import_Utils::clearUserImportInfo($user);
if($mode == 'upload_and_parse') {
if(Import_Index_Controller::validateFileUpload($requestObject)) {
Import_Index_Controller::loadAdvancedSettings($requestObject, $user);
exit;
}
} elseif($mode == 'import') {
Import_Controller::import($requestObject, $user);
exit;
}
Import_Index_Controller::loadBasicSettings($requestObject, $user);
}
}
?>