344 lines
12 KiB
PHP
344 lines
12 KiB
PHP
|
<?php
|
||
|
/*********************************************************************************
|
||
|
* The contents of this file are subject to the SugarCRM Public License Version 1.1.2
|
||
|
* ("License"); You may not use this file except in compliance with the
|
||
|
* License. You may obtain a copy of the License at http://www.sugarcrm.com/SPL
|
||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||
|
* the specific language governing rights and limitations under the License.
|
||
|
* The Original Code is: SugarCRM Open Source
|
||
|
* The Initial Developer of the Original Code is SugarCRM, Inc.
|
||
|
* Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.;
|
||
|
* All Rights Reserved.
|
||
|
* Contributor(s): ______________________________________.
|
||
|
********************************************************************************/
|
||
|
|
||
|
require_once('config.php');
|
||
|
require_once('include/logging.php');
|
||
|
require_once('include/database/PearDatabase.php');
|
||
|
require_once('modules/Accounts/Accounts.php');
|
||
|
require_once('modules/Contacts/Contacts.php');
|
||
|
require_once('modules/Leads/Leads.php');
|
||
|
require_once('modules/Contacts/Contacts.php');
|
||
|
require_once('modules/Emails/Emails.php');
|
||
|
require_once('modules/Calendar/Activity.php');
|
||
|
require_once('modules/Documents/Documents.php');
|
||
|
require_once('modules/Potentials/Potentials.php');
|
||
|
require_once('modules/Users/Users.php');
|
||
|
require_once('modules/Products/Products.php');
|
||
|
require_once('modules/HelpDesk/HelpDesk.php');
|
||
|
require_once('modules/Vendors/Vendors.php');
|
||
|
require_once('include/utils/UserInfoUtil.php');
|
||
|
require_once('modules/CustomView/CustomView.php');
|
||
|
require_once 'modules/PickList/PickListUtils.php';
|
||
|
|
||
|
// Set the current language and the language strings, if not already set.
|
||
|
setCurrentLanguage();
|
||
|
|
||
|
global $allow_exports,$app_strings;
|
||
|
|
||
|
session_start();
|
||
|
|
||
|
$current_user = new Users();
|
||
|
|
||
|
if(isset($_SESSION['authenticated_user_id']))
|
||
|
{
|
||
|
$result = $current_user->retrieveCurrentUserInfoFromFile($_SESSION['authenticated_user_id'],"Users");
|
||
|
if($result == null)
|
||
|
{
|
||
|
session_destroy();
|
||
|
header("Location: index.php?action=Login&module=Users");
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//Security Check
|
||
|
if(isPermitted($_REQUEST['module'],"Export") == "no")
|
||
|
{
|
||
|
$allow_exports="none";
|
||
|
}
|
||
|
|
||
|
if ($allow_exports=='none' || ( $allow_exports=='admin' && ! is_admin($current_user) ) )
|
||
|
{
|
||
|
|
||
|
?>
|
||
|
<script type='text/javascript'>
|
||
|
alert("<?php echo $app_strings['NOT_PERMITTED_TO_EXPORT']?>");
|
||
|
window.location="index.php?module=<?php echo vtlib_purify($_REQUEST['module']) ?>&action=index";
|
||
|
</script>
|
||
|
|
||
|
<?php exit; ?>
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
/**Function convert line breaks to space in description during export
|
||
|
* Pram $str - text
|
||
|
* retrun type string
|
||
|
*/
|
||
|
function br2nl_vt($str)
|
||
|
{
|
||
|
global $log;
|
||
|
$log->debug("Entering br2nl_vt(".$str.") method ...");
|
||
|
$str = preg_replace("/(\r\n)/", " ", $str);
|
||
|
$log->debug("Exiting br2nl_vt method ...");
|
||
|
return $str;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This function exports all the data for a given module
|
||
|
* Param $type - module name
|
||
|
* Return type text
|
||
|
*/
|
||
|
function export($type){
|
||
|
global $log,$list_max_entries_per_page;
|
||
|
$log->debug("Entering export(".$type.") method ...");
|
||
|
global $adb;
|
||
|
|
||
|
$focus = 0;
|
||
|
$content = '';
|
||
|
|
||
|
if ($type != ""){
|
||
|
// vtlib customization: Hook to dynamically include required module file.
|
||
|
// Refer to the logic in setting $currentModule in index.php
|
||
|
$focus = CRMEntity::getInstance($type);
|
||
|
}
|
||
|
$log = LoggerManager::getLogger('export_'.$type);
|
||
|
$db = PearDatabase::getInstance();
|
||
|
|
||
|
$oCustomView = new CustomView("$type");
|
||
|
$viewid = $oCustomView->getViewId("$type");
|
||
|
$sorder = $focus->getSortOrder();
|
||
|
$order_by = $focus->getOrderBy();
|
||
|
|
||
|
$search_type = $_REQUEST['search_type'];
|
||
|
$export_data = $_REQUEST['export_data'];
|
||
|
|
||
|
if(isset($_SESSION['export_where']) && $_SESSION['export_where']!='' && $search_type == 'includesearch'){
|
||
|
$where =$_SESSION['export_where'];
|
||
|
}
|
||
|
|
||
|
$query = $focus->create_export_query($where);
|
||
|
if($search_type != 'includesearch' && $type != 'Calendar') {
|
||
|
$stdfiltersql = $oCustomView->getCVStdFilterSQL($viewid);
|
||
|
$advfiltersql = $oCustomView->getCVAdvFilterSQL($viewid);
|
||
|
if(isset($stdfiltersql) && $stdfiltersql != ''){
|
||
|
$query .= ' and '.$stdfiltersql;
|
||
|
}
|
||
|
if(isset($advfiltersql) && $advfiltersql != '') {
|
||
|
$query .= ' and '.$advfiltersql;
|
||
|
}
|
||
|
}
|
||
|
$params = array();
|
||
|
|
||
|
if(($search_type == 'withoutsearch' || $search_type == 'includesearch') && $export_data == 'selecteddata'){
|
||
|
$idstring = explode(";", $_REQUEST['idstring']);
|
||
|
if($type == 'Accounts' && count($idstring) > 0) {
|
||
|
$query .= ' and vtiger_account.accountid in ('. generateQuestionMarks($idstring) .')';
|
||
|
array_push($params, $idstring);
|
||
|
} elseif($type == 'Contacts' && count($idstring) > 0) {
|
||
|
$query .= ' and vtiger_contactdetails.contactid in ('. generateQuestionMarks($idstring) .')';
|
||
|
array_push($params, $idstring);
|
||
|
} elseif($type == 'Potentials' && count($idstring) > 0) {
|
||
|
$query .= ' and vtiger_potential.potentialid in ('. generateQuestionMarks($idstring) .')';
|
||
|
array_push($params, $idstring);
|
||
|
} elseif($type == 'Leads' && count($idstring) > 0) {
|
||
|
$query .= ' and vtiger_leaddetails.leadid in ('. generateQuestionMarks($idstring) .')';
|
||
|
array_push($params, $idstring);
|
||
|
} elseif($type == 'Products' && count($idstring) > 0) {
|
||
|
$query .= ' and vtiger_products.productid in ('. generateQuestionMarks($idstring) .')';
|
||
|
array_push($params, $idstring);
|
||
|
} elseif($type == 'Documents' && count($idstring) > 0) {
|
||
|
$query .= ' and vtiger_notes.notesid in ('. generateQuestionMarks($idstring) .')';
|
||
|
array_push($params, $idstring);
|
||
|
} elseif($type == 'HelpDesk' && count($idstring) > 0) {
|
||
|
$query .= ' and vtiger_troubletickets.ticketid in ('. generateQuestionMarks($idstring) .')';
|
||
|
array_push($params, $idstring);
|
||
|
} elseif($type == 'Vendors' && count($idstring) > 0) {
|
||
|
$query .= ' and vtiger_vendor.vendorid in ('. generateQuestionMarks($idstring) .')';
|
||
|
array_push($params, $idstring);
|
||
|
} else if(count($idstring) > 0) {
|
||
|
// vtlib customization: Hook to make the export feature available for custom modules.
|
||
|
$query .= " and $focus->table_name.$focus->table_index in (" . generateQuestionMarks($idstring) . ')';
|
||
|
array_push($params, $idstring);
|
||
|
// END
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(isset($order_by) && $order_by != ''){
|
||
|
if($order_by == 'smownerid'){
|
||
|
$query .= ' ORDER BY user_name '.$sorder;
|
||
|
}elseif($order_by == 'lastname' && $type == 'Documents'){
|
||
|
$query .= ' ORDER BY vtiger_contactdetails.lastname '. $sorder;
|
||
|
}elseif($order_by == 'crmid' && $type == 'HelpDesk'){
|
||
|
$query .= ' ORDER BY vtiger_troubletickets.ticketid '. $sorder;
|
||
|
}else{
|
||
|
$tablename = getTableNameForField($type,$order_by);
|
||
|
$tablename = (($tablename != '')?($tablename."."):'');
|
||
|
if( $adb->dbType == "pgsql"){
|
||
|
$query .= ' GROUP BY '.$tablename.$order_by;
|
||
|
}
|
||
|
$query .= ' ORDER BY '.$tablename.$order_by.' '.$sorder;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if($export_data == 'currentpage'){
|
||
|
$current_page = ListViewSession::getCurrentPage($type,$viewid);
|
||
|
$limit_start_rec = ($current_page - 1) * $list_max_entries_per_page;
|
||
|
if ($limit_start_rec < 0) $limit_start_rec = 0;
|
||
|
$query .= ' LIMIT '.$limit_start_rec.','.$list_max_entries_per_page;
|
||
|
}
|
||
|
|
||
|
$result = $adb->pquery($query, $params, true, "Error exporting $type: "."<BR>$query");
|
||
|
$fields_array = $adb->getFieldsArray($result);
|
||
|
$fields_array = array_diff($fields_array,array("user_name"));
|
||
|
|
||
|
$__processor = new ExportUtils($type, $fields_array);
|
||
|
|
||
|
// Translated the field names based on the language used.
|
||
|
$translated_fields_array = array();
|
||
|
for($i=0; $i<count($fields_array); $i++) {
|
||
|
$translated_fields_array[$i] = getTranslatedString($fields_array[$i],$type);
|
||
|
}
|
||
|
$header = implode("\",\"",array_values($translated_fields_array));
|
||
|
$header = "\"" .$header;
|
||
|
$header .= "\"\r\n";
|
||
|
|
||
|
/** Output header information */
|
||
|
echo $header;
|
||
|
|
||
|
$column_list = implode(",",array_values($fields_array));
|
||
|
|
||
|
while($val = $adb->fetchByAssoc($result, -1, false)){
|
||
|
$new_arr = array();
|
||
|
$val = $__processor->sanitizeValues($val);
|
||
|
foreach ($val as $key => $value){
|
||
|
if($type == 'Documents' && $key == 'description'){
|
||
|
$value = strip_tags($value);
|
||
|
$value = str_replace(' ','',$value);
|
||
|
array_push($new_arr,$value);
|
||
|
}elseif($key != "user_name"){
|
||
|
// Let us provide the module to transform the value before we save it to CSV file
|
||
|
$value = $focus->transform_export_value($key, $value);
|
||
|
|
||
|
array_push($new_arr, preg_replace("/\"/","\"\"",$value));
|
||
|
}
|
||
|
}
|
||
|
$line = implode("\",\"",$new_arr);
|
||
|
$line = "\"" .$line;
|
||
|
$line .= "\"\r\n";
|
||
|
|
||
|
/** Output each row information */
|
||
|
echo $line;
|
||
|
}
|
||
|
$log->debug("Exiting export method ...");
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/** Send the output header and invoke function for contents output */
|
||
|
$moduleName = $_REQUEST['module'];
|
||
|
$moduleName = getTranslatedString($moduleName, $moduleName);
|
||
|
$moduleName = str_replace(" ","_",$moduleName);
|
||
|
header("Content-Disposition:attachment;filename=$moduleName.csv");
|
||
|
header("Content-Type:text/csv;charset=UTF-8");
|
||
|
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
|
||
|
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
|
||
|
header("Cache-Control: post-check=0, pre-check=0", false );
|
||
|
|
||
|
export(vtlib_purify($_REQUEST['module']));
|
||
|
|
||
|
exit;
|
||
|
|
||
|
/**
|
||
|
* this class will provide utility functions to process the export data.
|
||
|
* this is to make sure that the data is sanitized before sending for export
|
||
|
*/
|
||
|
class ExportUtils{
|
||
|
var $fieldsArr = array();
|
||
|
var $picklistValues = array();
|
||
|
|
||
|
function ExportUtils($module, $fields_array){
|
||
|
self::__init($module, $fields_array);
|
||
|
}
|
||
|
|
||
|
|
||
|
function __init($module, $fields_array){
|
||
|
$infoArr = self::getInformationArray($module);
|
||
|
|
||
|
//attach extra fields related information to the fields_array; this will be useful for processing the export data
|
||
|
foreach($infoArr as $fieldname=>$fieldinfo){
|
||
|
if(in_array($fieldinfo["fieldlabel"], $fields_array)){
|
||
|
$this->fieldsArr[$fieldname] = $fieldinfo;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* this function takes in an array of values for an user and sanitizes it for export
|
||
|
* @param array $arr - the array of values
|
||
|
*/
|
||
|
function sanitizeValues($arr){
|
||
|
global $current_user, $adb;
|
||
|
$roleid = fetchUserRole($current_user->id);
|
||
|
|
||
|
foreach($arr as $fieldlabel=>&$value){
|
||
|
$fieldInfo = $this->fieldsArr[$fieldlabel];
|
||
|
|
||
|
$uitype = $fieldInfo['uitype'];
|
||
|
$fieldname = $fieldInfo['fieldname'];
|
||
|
if($uitype == 15 || $uitype == 16 || $uitype == 33){
|
||
|
//picklists
|
||
|
if(empty($this->picklistValues[$fieldname])){
|
||
|
$this->picklistValues[$fieldname] = getAssignedPicklistValues($fieldname, $roleid, $adb);
|
||
|
}
|
||
|
$value = trim($value);
|
||
|
}elseif($uitype == 10){
|
||
|
//have to handle uitype 10
|
||
|
$value = trim($value);
|
||
|
if(!empty($value)) {
|
||
|
$parent_module = getSalesEntityType($value);
|
||
|
$displayValueArray = getEntityName($parent_module, $value);
|
||
|
if(!empty($displayValueArray)){
|
||
|
foreach($displayValueArray as $k=>$v){
|
||
|
$displayValue = $v;
|
||
|
}
|
||
|
}
|
||
|
if(!empty($parent_module) && !empty($displayValue)){
|
||
|
$value = $parent_module."::::".$displayValue;
|
||
|
}else{
|
||
|
$value = "";
|
||
|
}
|
||
|
} else {
|
||
|
$value = '';
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $arr;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* this function takes in a module name and returns the field information for it
|
||
|
*/
|
||
|
function getInformationArray($module){
|
||
|
require_once 'include/utils/utils.php';
|
||
|
global $adb;
|
||
|
$tabid = getTabid($module);
|
||
|
|
||
|
$result = $adb->pquery("select * from vtiger_field where tabid=?", array($tabid));
|
||
|
$count = $adb->num_rows($result);
|
||
|
$arr = array();
|
||
|
$data = array();
|
||
|
|
||
|
for($i=0;$i<$count;$i++){
|
||
|
$arr['uitype'] = $adb->query_result($result, $i, "uitype");
|
||
|
$arr['fieldname'] = $adb->query_result($result, $i, "fieldname");
|
||
|
$arr['columnname'] = $adb->query_result($result, $i, "columnname");
|
||
|
$arr['tablename'] = $adb->query_result($result, $i, "tablename");
|
||
|
$arr['fieldlabel'] = $adb->query_result($result, $i, "fieldlabel");
|
||
|
$fieldlabel = strtolower($arr['fieldlabel']);
|
||
|
$data[$fieldlabel] = $arr;
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
}
|
||
|
?>
|