PageRenderTime 104ms CodeModel.GetById 60ms app.highlight 35ms RepoModel.GetById 1ms app.codeStats 0ms

/include/export_utils.php

https://bitbucket.org/cviolette/sugarcrm
PHP | 819 lines | 725 code | 27 blank | 67 comment | 33 complexity | 885a0dd6cda051658520a90f522f787f MD5 | raw file
  1<?php
  2if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
  3/*********************************************************************************
  4 * SugarCRM Community Edition is a customer relationship management program developed by
  5 * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
  6 * 
  7 * This program is free software; you can redistribute it and/or modify it under
  8 * the terms of the GNU Affero General Public License version 3 as published by the
  9 * Free Software Foundation with the addition of the following permission added
 10 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
 11 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
 12 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 13 * 
 14 * This program is distributed in the hope that it will be useful, but WITHOUT
 15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 16 * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
 17 * details.
 18 * 
 19 * You should have received a copy of the GNU Affero General Public License along with
 20 * this program; if not, see http://www.gnu.org/licenses or write to the Free
 21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 22 * 02110-1301 USA.
 23 * 
 24 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
 25 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
 26 * 
 27 * The interactive user interfaces in modified source and object code versions
 28 * of this program must display Appropriate Legal Notices, as required under
 29 * Section 5 of the GNU Affero General Public License version 3.
 30 * 
 31 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
 32 * these Appropriate Legal Notices must retain the display of the "Powered by
 33 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
 34 * technical reasons, the Appropriate Legal Notices must display the words
 35 * "Powered by SugarCRM".
 36 ********************************************************************************/
 37
 38/*********************************************************************************
 39
 40 * Description:
 41 * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc. All Rights
 42 * Reserved. Contributor(s): ______________________________________..
 43 * *******************************************************************************/
 44
 45/**
 46 * gets the system default delimiter or an user-preference based override
 47 * @return string the delimiter
 48 */
 49function getDelimiter() {
 50    global $sugar_config;
 51    global $current_user;
 52
 53    $delimiter = ','; // default to "comma"
 54    $userDelimiter = $current_user->getPreference('export_delimiter');
 55    $delimiter = empty($sugar_config['export_delimiter']) ? $delimiter : $sugar_config['export_delimiter'];
 56    $delimiter = empty($userDelimiter) ? $delimiter : $userDelimiter;
 57
 58    return $delimiter;
 59}
 60
 61
 62/**
 63 * builds up a delimited string for export
 64 * @param string type the bean-type to export
 65 * @param array records an array of records if coming directly from a query
 66 * @return string delimited string for export
 67 */
 68function export($type, $records = null, $members = false, $sample=false) {
 69    global $beanList;
 70    global $beanFiles;
 71    global $current_user;
 72    global $app_strings;
 73    global $app_list_strings;
 74    global $timedate;
 75    global $mod_strings;
 76    global $current_language;
 77    $sampleRecordNum = 5;
 78    $contact_fields = array(
 79        "id"=>"Contact ID"
 80        ,"lead_source"=>"Lead Source"
 81        ,"date_entered"=>"Date Entered"
 82        ,"date_modified"=>"Date Modified"
 83        ,"first_name"=>"First Name"
 84        ,"last_name"=>"Last Name"
 85        ,"salutation"=>"Salutation"
 86        ,"birthdate"=>"Lead Source"
 87        ,"do_not_call"=>"Do Not Call"
 88        ,"email_opt_out"=>"Email Opt Out"
 89        ,"title"=>"Title"
 90        ,"department"=>"Department"
 91        ,"birthdate"=>"Birthdate"
 92        ,"do_not_call"=>"Do Not Call"
 93        ,"phone_home"=>"Phone (Home)"
 94        ,"phone_mobile"=>"Phone (Mobile)"
 95        ,"phone_work"=>"Phone (Work)"
 96        ,"phone_other"=>"Phone (Other)"
 97        ,"phone_fax"=>"Fax"
 98        ,"email1"=>"Email"
 99        ,"email2"=>"Email (Other)"
100        ,"assistant"=>"Assistant"
101        ,"assistant_phone"=>"Assistant Phone"
102        ,"primary_address_street"=>"Primary Address Street"
103        ,"primary_address_city"=>"Primary Address City"
104        ,"primary_address_state"=>"Primary Address State"
105        ,"primary_address_postalcode"=>"Primary Address Postalcode"
106        ,"primary_address_country"=>"Primary Address Country"
107        ,"alt_address_street"=>"Other Address Street"
108        ,"alt_address_city"=>"Other Address City"
109        ,"alt_address_state"=>"Other Address State"
110        ,"alt_address_postalcode"=>"Other Address Postalcode"
111        ,"alt_address_country"=>"Other Address Country"
112        ,"description"=>"Description"
113    );
114
115    $account_fields = array(
116        "id"=>"Account ID",
117        "name"=>"Account Name",
118        "website"=>"Website",
119        "industry"=>"Industry",
120        "account_type"=>"Type",
121        "ticker_symbol"=>"Ticker Symbol",
122        "employees"=>"Employees",
123        "ownership"=>"Ownership",
124        "phone_office"=>"Phone",
125        "phone_fax"=>"Fax",
126        "phone_alternate"=>"Other Phone",
127        "email1"=>"Email",
128        "email2"=>"Other Email",
129        "rating"=>"Rating",
130        "sic_code"=>"SIC Code",
131        "annual_revenue"=>"Annual Revenue",
132        "billing_address_street"=>"Billing Address Street",
133        "billing_address_city"=>"Billing Address City",
134        "billing_address_state"=>"Billing Address State",
135        "billing_address_postalcode"=>"Billing Address Postalcode",
136        "billing_address_country"=>"Billing Address Country",
137        "shipping_address_street"=>"Shipping Address Street",
138        "shipping_address_city"=>"Shipping Address City",
139        "shipping_address_state"=>"Shipping Address State",
140        "shipping_address_postalcode"=>"Shipping Address Postalcode",
141        "shipping_address_country"=>"Shipping Address Country",
142        "description"=>"Description"
143    );
144    //Array of fields that should not be exported, and are only used for logic
145    $remove_from_members = array("ea_deleted", "ear_deleted", "primary_address");
146    $focus = 0;
147    $content = '';
148
149    $bean = $beanList[$type];
150    require_once($beanFiles[$bean]);
151    $focus = new $bean;
152    $searchFields = array();
153    $db = DBManagerFactory::getInstance();
154
155    if($records) {
156        $records = explode(',', $records);
157        $records = "'" . implode("','", $records) . "'";
158        $where = "{$focus->table_name}.id in ($records)";
159    } elseif (isset($_REQUEST['all']) ) {
160        $where = '';
161    } else {
162        if(!empty($_REQUEST['current_post'])) {
163            $ret_array = generateSearchWhere($type, $_REQUEST['current_post']);
164
165            $where = $ret_array['where'];
166            $searchFields = $ret_array['searchFields'];
167        } else {
168            $where = '';
169        }
170    }
171    $order_by = "";
172    if($focus->bean_implements('ACL')){
173        if(!ACLController::checkAccess($focus->module_dir, 'export', true)){
174            ACLController::displayNoAccess();
175            sugar_die('');
176        }
177        if(ACLController::requireOwner($focus->module_dir, 'export')){
178            if(!empty($where)){
179                $where .= ' AND ';
180            }
181            $where .= $focus->getOwnerWhere($current_user->id);
182        }
183
184    }
185    // Export entire list was broken because the where clause already has "where" in it
186    // and when the query is built, it has a "where" as well, so the query was ill-formed.
187    // Eliminating the "where" here so that the query can be constructed correctly.
188    if($members == true){
189           $query = $focus->create_export_members_query($records);
190    }else{
191        $beginWhere = substr(trim($where), 0, 5);
192        if ($beginWhere == "where")
193            $where = substr(trim($where), 5, strlen($where));
194        $ret_array = create_export_query_relate_link_patch($type, $searchFields, $where);
195        if(!empty($ret_array['join'])) {
196            $query = $focus->create_export_query($order_by,$ret_array['where'],$ret_array['join']);
197        } else {
198            $query = $focus->create_export_query($order_by,$ret_array['where']);
199        }
200    }
201
202    $result = '';
203    $populate = false;
204    if($sample) {
205       $result = $db->limitQuery($query, 0, $sampleRecordNum, true, $app_strings['ERR_EXPORT_TYPE'].$type.": <BR>.".$query);
206        if( $focus->_get_num_rows_in_query($query)<1 ){
207            $populate = true;
208        }
209    }
210    else {
211        $result = $db->query($query, true, $app_strings['ERR_EXPORT_TYPE'].$type.": <BR>.".$query);
212    }
213
214
215    $fields_array = $db->getFieldsArray($result,true);
216
217    //set up the order on the header row
218    $fields_array = get_field_order_mapping($focus->module_dir, $fields_array);
219
220    //set up labels to be used for the header row
221    $field_labels = array();
222    foreach($fields_array as $key=>$dbname){
223        //Remove fields that are only used for logic
224        if($members && (in_array($dbname, $remove_from_members)))
225            continue;
226        
227        //default to the db name of label does not exist
228        $field_labels[$key] = translateForExport($dbname,$focus);
229    }
230
231    // setup the "header" line with proper delimiters
232    $content = "\"".implode("\"".getDelimiter()."\"", array_values($field_labels))."\"\r\n";
233    $pre_id = '';
234
235    if($populate){
236        //this is a sample request with no data, so create fake datarows
237         $content .= returnFakeDataRow($focus,$fields_array,$sampleRecordNum);
238    }else{
239        //process retrieved record
240    	while($val = $db->fetchByAssoc($result, false)) {
241
242            //order the values in the record array
243            $val = get_field_order_mapping($focus->module_dir,$val);
244
245            $new_arr = array();
246		if($members){
247			if($pre_id == $val['id'])
248				continue;
249			if($val['ea_deleted']==1 || $val['ear_deleted']==1){
250				$val['primary_email_address'] = '';
251			}
252			unset($val['ea_deleted']);
253			unset($val['ear_deleted']);
254			unset($val['primary_address']);
255		}
256		$pre_id = $val['id'];
257
258		foreach ($val as $key => $value)
259		{
260            //getting content values depending on their types
261            $fieldNameMapKey = $fields_array[$key];
262
263            if (isset($focus->field_name_map[$fieldNameMapKey])  && $focus->field_name_map[$fieldNameMapKey]['type'])
264            {
265                $fieldType = $focus->field_name_map[$fieldNameMapKey]['type'];
266                switch ($fieldType)
267                {
268                    //if our value is a currency field, then apply the users locale
269                    case 'currency':
270                        require_once('modules/Currencies/Currency.php');
271                        $value = currency_format_number($value);
272                        break;
273
274                    //if our value is a datetime field, then apply the users locale
275                    case 'datetime':
276                    case 'datetimecombo':
277                        $value = $timedate->to_display_date_time($db->fromConvert($value, 'datetime'));
278                        $value = preg_replace('/([pm|PM|am|AM]+)/', ' \1', $value);
279                        break;
280
281                    //kbrill Bug #16296
282                    case 'date':
283                        $value = $timedate->to_display_date($db->fromConvert($value, 'date'), false);
284                        break;
285
286                    // Bug 32463 - Properly have multienum field translated into something useful for the client
287                    case 'multienum':
288                        $value = str_replace("^","",$value);
289                        if (isset($focus->field_name_map[$fields_array[$key]]['options']) && isset($app_list_strings[$focus->field_name_map[$fields_array[$key]]['options']]) )
290                        {
291                            $valueArray = explode(",",$value);
292                            foreach ($valueArray as $multikey => $multivalue )
293                            {
294                                if (isset($app_list_strings[$focus->field_name_map[$fields_array[$key]]['options']][$multivalue]) )
295                                {
296                                    $valueArray[$multikey] = $app_list_strings[$focus->field_name_map[$fields_array[$key]]['options']][$multivalue];
297                                }
298                            }
299                            $value = implode(",",$valueArray);
300                        }
301                        break;
302                }
303            }
304
305        array_push($new_arr, preg_replace("/\"/","\"\"", $value));
306        }
307        $line = implode("\"".getDelimiter()."\"", $new_arr);
308        $line = "\"" .$line;
309        $line .= "\"\r\n";
310        $content .= $line;
311    }
312
313
314    }
315	return $content;
316
317}
318
319function generateSearchWhere($module, $query) {//this function is similar with function prepareSearchForm() in view.list.php
320    $seed = loadBean($module);
321    if(file_exists('modules/'.$module.'/SearchForm.html')){
322        if(file_exists('modules/' . $module . '/metadata/SearchFields.php')) {
323            require_once('include/SearchForm/SearchForm.php');
324            $searchForm = new SearchForm($module, $seed);
325        }
326        elseif(!empty($_SESSION['export_where'])) { //bug 26026, sometimes some module doesn't have a metadata/SearchFields.php, the searchfrom is generated in the ListView.php.
327        // Currently, massupdate will not generate the where sql. It will use the sql stored in the SESSION. But this will cause bug 24722, and it cannot be avoided now.
328            $where = $_SESSION['export_where'];
329            $whereArr = explode (" ", trim($where));
330            if ($whereArr[0] == trim('where')) {
331                $whereClean = array_shift($whereArr);
332            }
333            $where = implode(" ", $whereArr);
334            //rrs bug: 31329 - previously this was just returning $where, but the problem is the caller of this function
335            //expects the results in an array, not just a string. So rather than fixing the caller, I felt it would be best for
336            //the function to return the results in a standard format.
337            $ret_array['where'] = $where;
338            $ret_array['searchFields'] =array();
339            return $ret_array;
340        }
341        else {
342            return;
343        }
344    }
345    else{
346        require_once('include/SearchForm/SearchForm2.php');
347
348        if(file_exists('custom/modules/'.$module.'/metadata/metafiles.php')){
349            require('custom/modules/'.$module.'/metadata/metafiles.php');
350        }elseif(file_exists('modules/'.$module.'/metadata/metafiles.php')){
351            require('modules/'.$module.'/metadata/metafiles.php');
352        }
353
354        if (file_exists('custom/modules/'.$module.'/metadata/searchdefs.php'))
355        {
356            require_once('custom/modules/'.$module.'/metadata/searchdefs.php');
357        }
358        elseif (!empty($metafiles[$module]['searchdefs']))
359        {
360            require_once($metafiles[$module]['searchdefs']);
361        }
362        elseif (file_exists('modules/'.$module.'/metadata/searchdefs.php'))
363        {
364            require_once('modules/'.$module.'/metadata/searchdefs.php');
365        }
366
367        //fixing bug #48483: Date Range search on custom date field then export ignores range filter
368        // first of all custom folder should be checked
369        if(file_exists('custom/modules/'.$module.'/metadata/SearchFields.php'))
370        {
371            require_once('custom/modules/'.$module.'/metadata/SearchFields.php');
372        }
373        elseif(!empty($metafiles[$module]['searchfields']))
374        {
375            require_once($metafiles[$module]['searchfields']);
376        }
377        elseif(file_exists('modules/'.$module.'/metadata/SearchFields.php'))
378        {
379            require_once('modules/'.$module.'/metadata/SearchFields.php');
380        }
381        if(empty($searchdefs) || empty($searchFields)) {
382           //for some modules, such as iframe, it has massupdate, but it doesn't have search function, the where sql should be empty.
383            return;
384        }
385        $searchForm = new SearchForm($seed, $module);
386        $searchForm->setup($searchdefs, $searchFields, 'SearchFormGeneric.tpl');
387    }
388    $searchForm->populateFromArray(unserialize(base64_decode($query)));
389    $where_clauses = $searchForm->generateSearchWhere(true, $module);
390    if (count($where_clauses) > 0 )$where = '('. implode(' ) AND ( ', $where_clauses) . ')';
391        $GLOBALS['log']->info("Export Where Clause: {$where}");
392    $ret_array['where'] = $where;
393    $ret_array['searchFields'] = $searchForm->searchFields;
394    return $ret_array;
395}
396/**
397  * calls export method to build up a delimited string and some sample instructional text on how to use this file
398  * @param string type the bean-type to export
399  * @return string delimited string for export with some tutorial text
400  */
401     function exportSample($type) {
402         global $app_strings;
403
404         //first grab the
405         $_REQUEST['all']=true;
406
407         //retrieve the export content
408         $content = export($type, null, false, true);
409
410         //add details on removing the sample data
411         return $content . $app_strings['LBL_IMPORT_SAMPLE_FILE_TEXT'];
412
413     }
414 //this function will take in the bean and field mapping and return a proper value
415 function returnFakeDataRow($focus,$field_array,$rowsToReturn = 5){
416
417    if(empty($focus) || empty($field_array))
418     return ;
419
420     //include the file that defines $sugar_demodata
421     include('install/demoData.en_us.php');
422
423    $person_bean = false;
424    if( isset($focus->first_name)){
425        $person_bean = true;
426    }
427
428     global $timedate;
429     $returnContent = '';
430     $counter = 0;
431     $new_arr = array();
432
433     //iterate through the record creation process as many times as defined.  Each iteration will create a new row
434     while($counter < $rowsToReturn){
435         $counter++;
436         //go through each field and populate with dummy data if possible
437         foreach($field_array as $field_name){
438
439            if(empty($focus->field_name_map[$field_name]) || empty($focus->field_name_map[$field_name]['type'])){
440                //type is not set, fill in with empty string and continue;
441                $returnContent .= '"",';
442                continue;
443            }
444            $field = $focus->field_name_map[$field_name];
445                         //fill in value according to type
446            $type = $field['type'];
447
448             switch ($type) {
449
450                 case "id":
451                 case "assigned_user_name":
452                     //return new guid string
453                    $returnContent .= '"'.create_guid().'",';
454                     break;
455                 case "int":
456                     //return random number`
457                    $returnContent .= '"'.mt_rand(0,4).'",';
458                     break;
459                 case "name":
460                     //return first, last, user name, or random name string
461                     if($field['name'] == 'first_name'){
462                         $count = count($sugar_demodata['first_name_array']) - 1;
463                        $returnContent .= '"'.$sugar_demodata['last_name_array'][mt_rand(0,$count)].'",';
464                     }elseif($field['name'] == 'last_name'){
465                         $count = count($sugar_demodata['last_name_array']) - 1;
466                         $returnContent .= '"'.$sugar_demodata['last_name_array'][mt_rand(0,$count)].'",';
467                     }elseif($field['name'] == 'user_name'){
468                       $count = count($sugar_demodata['first_name_array']) - 1;
469                        $returnContent .= '"'.$sugar_demodata['last_name_array'][mt_rand(0,$count)].'_'.mt_rand(1,111).'",';
470                     }else{
471                         //return based on bean
472                         if($focus->module_dir =='Accounts'){
473                             $count = count($sugar_demodata['company_name_array']) - 1;
474                            $returnContent .= '"'.$sugar_demodata['company_name_array'][mt_rand(0,$count)].'",';
475
476                         }elseif($focus->module_dir =='Bugs'){
477                             $count = count($sugar_demodata['bug_seed_names']) - 1;
478                            $returnContent .= '"'.$sugar_demodata['bug_seed_names'][mt_rand(0,$count)].'",';
479                         }elseif($focus->module_dir =='Notes'){
480                             $count = count($sugar_demodata['note_seed_names_and_Descriptions']) - 1;
481                            $returnContent .= '"'.$sugar_demodata['note_seed_names_and_Descriptions'][mt_rand(0,$count)].'",';
482
483                         }elseif($focus->module_dir =='Calls'){
484                              $count = count($sugar_demodata['call_seed_data_names']) - 1;
485                            $returnContent .= '"'.$sugar_demodata['call_seed_data_names'][mt_rand(0,$count)].'",';
486
487                         }elseif($focus->module_dir =='Tasks'){
488                             $count = count($sugar_demodata['task_seed_data_names']) - 1;
489                           $returnContent .= '"'.$sugar_demodata['task_seed_data_names'][mt_rand(0,$count)].'",';
490
491                         }elseif($focus->module_dir =='Meetings'){
492                             $count = count($sugar_demodata['meeting_seed_data_names']) - 1;
493                           $returnContent .= '"'.$sugar_demodata['meeting_seed_data_names'][mt_rand(0,$count)].'",';
494
495                         }elseif($focus->module_dir =='ProductCategories'){
496                             $count = count($sugar_demodata['productcategory_seed_data_names']) - 1;
497                           $returnContent .= '"'.$sugar_demodata['productcategory_seed_data_names'][mt_rand(0,$count)].'",';
498
499
500                         }elseif($focus->module_dir =='ProductTypes'){
501                             $count = count($sugar_demodata['producttype_seed_data_names']) - 1;
502                           $returnContent .= '"'.$sugar_demodata['producttype_seed_data_names'][mt_rand(0,$count)].'",';
503
504
505                         }elseif($focus->module_dir =='ProductTemplates'){
506                             $count = count($sugar_demodata['producttemplate_seed_data']) - 1;
507                           $returnContent .= '"'.$sugar_demodata['producttemplate_seed_data'][mt_rand(0,$count)].'",';
508
509                         }else{
510                           $returnContent .= '"Default Name for '.$focus->module_dir.'",';
511
512                         }
513
514                     }
515                    break;
516                 case "relate":
517                     if($field['name'] == 'team_name'){
518                         //apply team names and user_name
519                         $teams_count = count($sugar_demodata['teams']) - 1;
520                         $users_count = count($sugar_demodata['users']) - 1;
521
522                     $returnContent .= '"'.$sugar_demodata['teams'][mt_rand(0,$teams_count)]['name'].','.$sugar_demodata['users'][mt_rand(0,$users_count)]['user_name'].'",';
523
524                     }else{
525                         //apply GUID
526                         $returnContent .= '"'.create_guid().'",';
527                     }
528                     break;
529                 case "bool":
530                     //return 0 or 1
531                     $returnContent .= '"'.mt_rand(0,1).'",';
532                     break;
533
534                 case "text":
535                     //return random text
536                     $returnContent .= '"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna",';
537                     break;
538
539                 case "team_list":
540                     $teams_count = count($sugar_demodata['teams']) - 1;
541                     //give fake team names (East,West,North,South)
542                     $returnContent .= '"'.$sugar_demodata['teams'][mt_rand(0,$teams_count)]['name'].'",';
543                     break;
544
545                 case "date":
546                     //return formatted date
547                     $timeStamp = strtotime('now');
548                     $value =    date($timedate->dbDayFormat, $timeStamp);
549                     $returnContent .= '"'.$timedate->to_display_date_time($value).'",';
550                     break;
551
552                 case "datetime":
553                 case "datetimecombo":
554                     //return formatted date time
555                     $timeStamp = strtotime('now');
556                     //Start with db date
557                     $value =    date($timedate->dbDayFormat.' '.$timedate->dbTimeFormat, $timeStamp);
558                     //use timedate to convert to user display format
559                     $value = $timedate->to_display_date_time($value);
560                     //finally forma the am/pm to have a space so it can be recognized as a date field in excel
561                     $value = preg_replace('/([pm|PM|am|AM]+)/', ' \1', $value);
562                     $returnContent .= '"'.$value.'",';
563
564                     break;
565                case "phone":
566                    $value = '('.mt_rand(300,999).') '.mt_rand(300,999).'-'.mt_rand(1000,9999);
567                      $returnContent .= '"'.$value.'",';
568                     break;
569                 case "varchar":
570                                     //process varchar for possible values
571                                     if($field['name'] == 'first_name'){
572                                         $count = count($sugar_demodata['first_name_array']) - 1;
573                                        $returnContent .= '"'.$sugar_demodata['last_name_array'][mt_rand(0,$count)].'",';
574                                     }elseif($field['name'] == 'last_name'){
575                                         $count = count($sugar_demodata['last_name_array']) - 1;
576                                         $returnContent .= '"'.$sugar_demodata['last_name_array'][mt_rand(0,$count)].'",';
577                                     }elseif($field['name'] == 'user_name'){
578                                       $count = count($sugar_demodata['first_name_array']) - 1;
579                                        $returnContent .= '"'.$sugar_demodata['last_name_array'][mt_rand(0,$count)].'_'.mt_rand(1,111).'",';
580                                     }elseif($field['name'] == 'title'){
581                                         $count = count($sugar_demodata['titles']) - 1;
582                                         $returnContent .= '"'.$sugar_demodata['titles'][mt_rand(0,$count)].'",';
583                                     }elseif(strpos($field['name'],'address_street')>0){
584                                       $count = count($sugar_demodata['street_address_array']) - 1;
585                                        $returnContent .= '"'.$sugar_demodata['street_address_array'][mt_rand(0,$count)].'",';
586                                     }elseif(strpos($field['name'],'address_city')>0){
587                                       $count = count($sugar_demodata['city_array']) - 1;
588                                        $returnContent .= '"'.$sugar_demodata['city_array'][mt_rand(0,$count)].'",';
589                                     }elseif(strpos($field['name'],'address_state')>0){
590                                         $state_arr = array('CA','NY','CO','TX','NV');
591                                       $count = count($state_arr) - 1;
592                                        $returnContent .= '"'.$state_arr[mt_rand(0,$count)].'",';
593                                     }elseif(strpos($field['name'],'address_postalcode')>0){
594                                        $returnContent .= '"'.mt_rand(12345,99999).'",';
595                                     }else{
596                                         $returnContent .= '"",';
597
598                                     }
599                     break;
600                case "url":
601                     $returnContent .= '"https://www.sugarcrm.com",';
602                     break;
603
604                case "enum":
605                    //get the associated enum if available
606                    global $app_list_strings;
607
608                    if(isset($focus->field_name_map[$field_name]['type']) && !empty($focus->field_name_map[$field_name]['options'])){
609                        if ( !empty($app_list_strings[$focus->field_name_map[$field_name]['options']]) ) {
610
611                            //get the values into an array
612                            $dd_values = $app_list_strings[$focus->field_name_map[$field_name]['options']];
613                            $dd_values = array_values($dd_values);
614
615                            //grab the count
616                            $count = count($dd_values) - 1;
617
618                            //choose one at random
619                            $returnContent .= '"'.$dd_values[mt_rand(0,$count)].'",';
620                            } else{
621                                //name of enum options array was found but is empty, return blank
622                                $returnContent .= '"",';
623                            }
624                    }else{
625                        //name of enum options array was not found on field, return blank
626                        $returnContent .= '"",';
627                    }
628                     break;
629                default:
630                    //type is not matched, fill in with empty string and continue;
631                    $returnContent .= '"",';
632
633             }
634         }
635         $returnContent .= "\r\n";
636     }
637     return $returnContent;
638 }
639
640
641
642
643 //expects the field name to translate and a bean of the type being translated (to access field map and mod_strings)
644 function translateForExport($field_db_name,$focus){
645     global $mod_strings,$app_strings;
646
647     if (empty($field_db_name) || empty($focus)){
648        return false;
649     }
650
651    //grab the focus module strings
652    $temp_mod_strings = $mod_strings;
653    global $current_language;
654    $mod_strings = return_module_language($current_language, $focus->module_dir);
655    $fieldLabel = '';
656
657     //!! first check to see if we are overriding the label for export.
658     if (!empty($mod_strings['LBL_EXPORT_'.strtoupper($field_db_name)])){
659         //entry exists which means we are overriding this value for exporting, use this label
660         $fieldLabel = $mod_strings['LBL_EXPORT_'.strtoupper($field_db_name)];
661
662     }
663     //!! next check to see if we are overriding the label for export on app_strings.
664     elseif (!empty($app_strings['LBL_EXPORT_'.strtoupper($field_db_name)])){
665         //entry exists which means we are overriding this value for exporting, use this label
666         $fieldLabel = $app_strings['LBL_EXPORT_'.strtoupper($field_db_name)];
667
668     }//check to see if label exists in mapping and in mod strings
669     elseif (!empty($focus->field_name_map[$field_db_name]['vname']) && !empty($mod_strings[$focus->field_name_map[$field_db_name]['vname']])){
670         $fieldLabel = $mod_strings[$focus->field_name_map[$field_db_name]['vname']];
671
672     }//check to see if label exists in mapping and in app strings
673     elseif (!empty($focus->field_name_map[$field_db_name]['vname']) && !empty($app_strings[$focus->field_name_map[$field_db_name]['vname']])){
674         $fieldLabel = $app_strings[$focus->field_name_map[$field_db_name]['vname']];
675
676     }//field is not in mapping, so check to see if db can be uppercased and found in mod strings
677     elseif (!empty($mod_strings['LBL_'.strtoupper($field_db_name)])){
678         $fieldLabel = $mod_strings['LBL_'.strtoupper($field_db_name)];
679
680     }//check to see if db can be uppercased and found in app strings
681     elseif (!empty($app_strings['LBL_'.strtoupper($field_db_name)])){
682         $fieldLabel = $app_strings['LBL_'.strtoupper($field_db_name)];
683
684     }else{
685         //we could not find the label in mod_strings or app_strings based on either a mapping entry
686         //or on the db_name itself or being overwritten, so default to the db name as a last resort
687         $fieldLabel = $field_db_name;
688
689     }
690     //strip the label of any columns
691     $fieldLabel= preg_replace("/([:]|\xEF\xBC\x9A)[\\s]*$/", '', trim($fieldLabel));
692
693     //reset the bean mod_strings back to original import strings
694     $mod_strings = $temp_mod_strings;
695     return $fieldLabel;
696
697 }
698
699//call this function to return the desired order to display columns for export in.
700//if you pass in an array, it will reorder the array and send back to you.  It expects the array
701//to have the db names as key values, or as labels
702function get_field_order_mapping($name='',$reorderArr = '', $exclude = true){
703
704    //define the ordering of fields, note that the key value is what is important, and should be the db field name
705    $field_order_array = array();
706    $field_order_array['accounts'] = array( 'name'=>'Name', 'id'=>'ID', 'website'=>'Website', 'email_address' =>'Email Address', 'phone_office' =>'Office Phone', 'phone_alternate' => 'Alternate Phone', 'phone_fax' => 'Fax', 'billing_address_street' => 'Billing Street', 'billing_address_city' => 'Billing City', 'billing_address_state' => 'Billing State', 'billing_address_postalcode' => 'Billing Postal Code', 'billing_address_country' => 'Billing Country', 'shipping_address_street' => 'Shipping Street', 'shipping_address_city' => 'Shipping City', 'shipping_address_state' => 'Shipping State', 'shipping_address_postalcode' => 'Shipping Postal Code', 'shipping_address_country' => 'Shipping Country', 'description' => 'Description', 'account_type' => 'Type', 'industry' =>'Industry', 'annual_revenue' => 'Annual Revenue', 'employees' => 'Employees', 'sic_code' => 'SIC Code', 'ticker_symbol' => 'Ticker Symbol', 'parent_id' => 'Parent Account ID', 'ownership' =>'Ownership', 'campaign_id' =>'Campaign ID', 'rating' =>'Rating', 'assigned_user_name' =>'Assigned to',  'assigned_user_id' =>'Assigned User ID', 'team_id' =>'Team Id', 'team_name' =>'Teams', 'team_set_id' =>'Team Set ID', 'date_entered' =>'Date Created', 'date_modified' =>'Date Modified', 'modified_user_id' =>'Modified By', 'created_by' =>'Created By', 'deleted' =>'Deleted');
707    $field_order_array['contacts'] = array( 'first_name' => 'First Name', 'last_name' => 'Last Name', 'id'=>'ID', 'salutation' => 'Salutation', 'title' => 'Title', 'department' => 'Department', 'account_name' => 'Account Name', 'email_address' => 'Email Address', 'phone_mobile' => 'Phone Mobile','phone_work' => 'Phone Work', 'phone_home' => 'Phone Home',  'phone_other' => 'Phone Other','phone_fax' => 'Phone Fax', 'primary_address_street' => 'Primary Address Street', 'primary_address_city' => 'Primary Address City', 'primary_address_state' => 'Primary Address State', 'primary_address_postalcode' => 'Primary Address Postal Code', 'primary_address_country' => 'Primary Address Country', 'alt_address_street' => 'Alternate Address Street', 'alt_address_city' => 'Alternate Address City', 'alt_address_state' => 'Alternate Address State', 'alt_address_postalcode' => 'Alternate Address Postal Code', 'alt_address_country' => 'Alternate Address Country', 'description' => 'Description', 'birthdate' => 'Birthdate', 'lead_source' => 'Lead Source', 'campaign_id' => 'campaign_id', 'do_not_call' => 'Do Not Call', 'portal_name' => 'Portal Name', 'portal_active' => 'Portal Active', 'portal_password' => 'Portal Password', 'portal_app' => 'Portal Application', 'reports_to_id' => 'Reports to ID', 'assistant' => 'Assistant', 'assistant_phone' => 'Assistant Phone', 'picture' => 'Picture', 'assigned_user_name' => 'Assigned User Name', 'assigned_user_id' => 'Assigned User ID', 'team_name' => 'Teams', 'team_id' => 'Team id', 'team_set_id' => 'Team Set ID', 'date_entered' =>'Date Created', 'date_modified' =>'Date Modified', 'modified_user_id' =>'Modified By', 'created_by' =>'Created By', 'deleted' =>'Deleted');
708    $field_order_array['leads']    = array( 'first_name' => 'First Name', 'last_name' => 'Last Name', 'id'=>'ID', 'salutation' => 'Salutation', 'title' => 'Title', 'department' => 'Department', 'account_name' => 'Account Name', 'account_description' =>  'Account Description', 'website' =>  'Website', 'email_address' =>  'Email Address', 'phone_mobile' =>  'Phone Mobile', 'phone_work' =>  'Phone Work', 'phone_home' =>  'Phone Home', 'phone_other' =>  'Phone Other', 'phone_fax' =>  'Phone Fax', 'primary_address_street' =>  'Primary Address Street', 'primary_address_city' =>  'Primary Address City', 'primary_address_state' =>  'Primary Address State', 'primary_address_postalcode' =>  'Primary Address Postal Code', 'primary_address_country' =>  'Primary Address Country', 'alt_address_street' =>  'Alt Address Street', 'alt_address_city' =>  'Alt Address City', 'alt_address_state' =>  'Alt Address State', 'alt_address_postalcode' =>  'Alt Address Postalcode', 'alt_address_country' =>  'Alt Address Country', 'status' =>  'Status', 'status_description' =>  'Status Description', 'lead_source' =>  'Lead Source', 'lead_source_description' =>  'Lead Source Description', 'description'=>'Description', 'converted' =>  'Converted', 'opportunity_name' =>  'Opportunity Name', 'opportunity_amount' =>  'Opportunity Amount', 'refered_by' =>  'Referred By', 'campaign_id' =>  'campaign_id', 'do_not_call' =>  'Do Not Call', 'portal_name' =>  'Portal Name', 'portal_app' =>  'Portal Application', 'reports_to_id' =>  'Reports To ID', 'assistant' =>  'Assistant', 'assistant_phone' =>  'Assistant Phone', 'birthdate'=>'Birthdate', 'contact_id' =>  'Contact ID', 'account_id' =>  'Account ID', 'opportunity_id' =>  'Opportunity ID',  'assigned_user_name' =>  'Assigned User Name', 'assigned_user_id' =>  'Assigned User ID', 'team_name' =>  'Teams', 'team_id' =>  'Team id', 'team_set_id' =>  'Team Set ID', 'date_entered' =>  'Date Created', 'date_modified' =>  'Date Modified', 'created_by' =>  'Created By ID', 'modified_user_id' =>  'Modified By ID', 'deleted' =>  'Deleted');
709    $field_order_array['opportunities'] = array( 'name' => 'Opportunity Name', 'id'=>'ID', 'amount' => 'Opportunity Amount', 'currency_id' => 'Currency', 'date_closed' => 'Expected Close Date', 'sales_stage' => 'Sales Stage', 'probability' => 'Probability (%)', 'next_step' => 'Next Step', 'opportunity_type' => 'Opportunity Type', 'account_name' => 'Account Name', 'description' => 'Description', 'amount_usdollar' => 'Amount', 'lead_source' => 'Lead Source', 'campaign_id' => 'campaign_id', 'assigned_user_name' => 'Assigned User Name', 'assigned_user_id' => 'Assigned User ID', 'team_name' => 'Teams', 'team_id' => 'Team id', 'team_set_id' => 'Team Set ID', 'date_entered' => 'Date Created', 'date_modified' => 'Date Modified', 'created_by' => 'Created By ID', 'modified_user_id' => 'Modified By ID', 'deleted' => 'Deleted');
710    $field_order_array['notes'] =         array( 'name' => 'Name', 'id'=>'ID', 'description' => 'Description', 'filename' => 'Attachment', 'parent_type' => 'Parent Type', 'parent_id' => 'Parent ID', 'contact_id' => 'Contact ID', 'portal_flag' => 'Display in Portal?', 'assigned_user_name' =>'Assigned to', 'assigned_user_id' => 'assigned_user_id', 'team_id' => 'Team id', 'team_set_id' => 'Team Set ID', 'date_entered' => 'Date Created', 'date_modified' => 'Date Modified',  'created_by' => 'Created By ID', 'modified_user_id' => 'Modified By ID', 'deleted' => 'Deleted' );
711    $field_order_array['bugs'] =   array('bug_number' => 'Bug Number', 'id'=>'ID', 'name' => 'Subject', 'description' => 'Description', 'status' => 'Status', 'type' => 'Type', 'priority' => 'Priority', 'resolution' => 'Resolution', 'work_log' => 'Work Log', 'found_in_release' => 'Found In Release', 'fixed_in_release' => 'Fixed In Release', 'found_in_release_name' => 'Found In Release Name', 'fixed_in_release_name' => 'Fixed In Release', 'product_category' => 'Category', 'source' => 'Source', 'portal_viewable' => 'Portal Viewable', 'system_id' => 'System ID', 'assigned_user_id' => 'Assigned User ID', 'assigned_user_name' => 'Assigned User Name', 'team_name'=>'Teams', 'team_id' => 'Team id', 'team_set_id' => 'Team Set ID', 'date_entered' =>'Date Created', 'date_modified' =>'Date Modified', 'modified_user_id' =>'Modified By', 'created_by' =>'Created By', 'deleted' =>'Deleted');
712    $field_order_array['tasks'] =   array( 'name'=>'Subject', 'id'=>'ID', 'description'=>'Description', 'status'=>'Status', 'date_start'=>'Date Start', 'date_due'=>'Date Due','priority'=>'Priority', 'parent_type'=>'Parent Type', 'parent_id'=>'Parent ID', 'contact_id'=>'Contact ID', 'assigned_user_name' =>'Assigned to', 'assigned_user_id'=>'Assigned User ID', 'team_name'=>'Teams', 'team_id'=>'Team id', 'team_set_id'=>'Team Set ID', 'date_entered'=>'Date Created', 'date_modified'=>'Date Modified', 'created_by'=>'Created By ID', 'modified_user_id'=>'Modified By ID', 'deleted'=>'Deleted');
713    $field_order_array['calls'] =   array( 'name'=>'Subject', 'id'=>'ID', 'description'=>'Description', 'status'=>'Status', 'direction'=>'Direction', 'date_start'=>'Date', 'date_end'=>'Date End', 'duration_hours'=>'Duration Hours', 'duration_minutes'=>'Duration Minutes', 'reminder_time'=>'Reminder Time', 'parent_type'=>'Parent Type', 'parent_id'=>'Parent ID', 'outlook_id'=>'Outlook ID', 'assigned_user_name' =>'Assigned to', 'assigned_user_id'=>'Assigned User ID', 'team_name'=>'Teams', 'team_id'=>'Team id', 'team_set_id'=>'Team Set ID', 'date_entered'=>'Date Created', 'date_modified'=>'Date Modified', 'created_by'=>'Created By ID', 'modified_user_id'=>'Modified By ID', 'deleted'=>'Deleted');
714    $field_order_array['meetings'] =array( 'name'=>'Subject', 'id'=>'ID', 'description'=>'Description', 'status'=>'Status', 'location'=>'Location', 'date_start'=>'Date', 'date_end'=>'Date End', 'duration_hours'=>'Duration Hours', 'duration_minutes'=>'Duration Minutes', 'reminder_time'=>'Reminder Time', 'type'=>'Meeting Type', 'external_id'=>'External ID', 'password'=>'Meeting Password', 'join_url'=>'Join Url', 'host_url'=>'Host Url', 'displayed_url'=>'Displayed Url', 'creator'=>'Meeting Creator', 'parent_type'=>'Related to', 'parent_id'=>'Related to', 'outlook_id'=>'Outlook ID','assigned_user_name' =>'Assigned to','assigned_user_id' => 'Assigned User ID', 'team_name' => 'Teams', 'team_id' => 'Team id', 'team_set_id' => 'Team Set ID', 'date_entered' => 'Date Created', 'date_modified' => 'Date Modified', 'created_by' => 'Created By ID', 'modified_user_id' => 'Modified By ID', 'deleted' => 'Deleted');
715    $field_order_array['cases'] =array( 'case_number'=>'Case Number', 'id'=>'ID', 'name'=>'Subject', 'description'=>'Description', 'status'=>'Status', 'type'=>'Type', 'priority'=>'Priority', 'resolution'=>'Resolution', 'work_log'=>'Work Log', 'portal_viewable'=>'Portal Viewable', 'account_name'=>'Account Name', 'account_id'=>'Account ID', 'assigned_user_id'=>'Assigned User ID', 'team_name'=>'Teams', 'team_id'=>'Team id', 'team_set_id'=>'Team Set ID', 'date_entered'=>'Date Created', 'date_modified'=>'Date Modified', 'created_by'=>'Created By ID', 'modified_user_id'=>'Modified By ID', 'deleted'=>'Deleted');
716    $field_order_array['prospects'] =array( 'first_name'=>'First Name', 'last_name'=>'Last Name', 'id'=>'ID', 'salutation'=>'Salutation', 'title'=>'Title', 'department'=>'Department', 'account_name'=>'Account Name', 'email_address'=>'Email Address', 'phone_mobile' => 'Phone Mobile', 'phone_work' => 'Phone Work', 'phone_home' => 'Phone Home', 'phone_other' => 'Phone Other', 'phone_fax' => 'Phone Fax',  'primary_address_street' => 'Primary Address Street', 'primary_address_city' => 'Primary Address City', 'primary_address_state' => 'Primary Address State', 'primary_address_postalcode' => 'Primary Address Postal Code', 'primary_address_country' => 'Primary Address Country', 'alt_address_street' => 'Alternate Address Street', 'alt_address_city' => 'Alternate Address City', 'alt_address_state' => 'Alternate Address State', 'alt_address_postalcode' => 'Alternate Address Postal Code', 'alt_address_country' => 'Alternate Address Country', 'description' => 'Description', 'birthdate' => 'Birthdate', 'assistant'=>'Assistant', 'assistant_phone'=>'Assistant Phone', 'campaign_id'=>'campaign_id', 'tracker_key'=>'Tracker Key', 'do_not_call'=>'Do Not Call', 'lead_id'=>'Lead Id', 'assigned_user_name'=>'Assigned User Name', 'assigned_user_id'=>'Assigned User ID', 'team_id' =>'Team Id', 'team_name' =>'Teams', 'team_set_id' =>'Team Set ID', 'date_entered' =>'Date Created', 'date_modified' =>'Date Modified', 'modified_user_id' =>'Modified By', 'created_by' =>'Created By', 'deleted' =>'Deleted');
717
718    $fields_to_exclude = array();
719    $fields_to_exclude['accounts'] = array('account_name');
720    $fields_to_exclude['bugs'] = array('system_id');
721    $fields_to_exclude['cases'] = array('system_id', 'modified_by_name', 'modified_by_name_owner', 'modified_by_name_mod', 'created_by_name', 'created_by_name_owner', 'created_by_name_mod', 'assigned_user_name', 'assigned_user_name_owner', 'assigned_user_name_mod', 'team_count', 'team_count_owner', 'team_count_mod', 'team_name_owner', 'team_name_mod', 'account_name_owner', 'account_name_mod', 'modified_user_name',  'modified_user_name_owner', 'modified_user_name_mod');
722    $fields_to_exclude['notes'] = array('first_name','last_name', 'file_mime_type','embed_flag');
723    $fields_to_exclude['tasks'] = array('date_start_flag', 'date_due_flag');
724
725    //of array is passed in for reordering, process array
726    if(!empty($name) && !empty($reorderArr) && is_array($reorderArr)){
727
728        //make sure reorderArr has values as keys, if not then iterate through and assign the value as the key
729        $newReorder = array();
730        foreach($reorderArr as $rk=> $rv){
731            if(is_int($rk)){
732                $newReorder[$rv]=$rv;
733            }else{
734                $newReorder[$rk]=$rv;
735            }
736        }
737
738        //if module is not defined, lets default the order to another module of the same type
739        //this would apply mostly to custom modules
740        if(!isset($field_order_array[strtolower($name)]) && isset($_REQUEST['module'])){
741
742            $exemptModuleList = array('ProspectLists');
743            if(in_array($name, $exemptModuleList))
744                return $newReorder;
745
746            //get an instance of the bean
747            global $beanList;
748            global $beanFiles;
749
750            $bean = $beanList[$_REQUEST['module']];
751            require_once($beanFiles[$bean]);
752            $focus = new $bean;
753
754
755            //if module is of type person
756            if($focus instanceof Person){
757                $name = 'contacts';
758            }
759            //if module is of type company
760            else if ($focus instanceof Company){
761                $name = 'accounts';
762            }
763            //if module is of type Sale
764            else if ($focus instanceof Sale){
765                $name = 'opportunities';
766            }//if module is of type File
767            else if ($focus instanceof Issue){
768                $name = 'bugs';
769            }//all others including type File can use basic
770            else{
771                $name = 'Notes';
772            }
773
774        }
775
776        //lets iterate through and create a reordered temporary array using
777        //the  newly formatted copy of passed in array
778        $temp_result_arr = array();
779        $lname = strtolower($name);
780        if(!empty($field_order_array[$lname])) {
781	        foreach($field_order_array[$lname] as $fk=> $fv){
782
783	            //if the value exists as a key in the passed in array, add to temp array and remove from reorder array.
784	            //Do not force into the temp array as we don't want to violate acl's
785	            if(array_key_exists($fk,$newReorder)){
786	                $temp_result_arr[$fk] = $newReorder[$fk];
787	                unset($newReorder[$fk]);
788	            }
789	        }
790        }
791        //add in all the left over values that were not in our ordered list
792        //array_splice($temp_result_arr, count($temp_result_arr), 0, $newReorder);
793        foreach($newReorder as $nrk=>$nrv){
794            $temp_result_arr[$nrk] = $nrv;
795        }
796
797
798        if($exclude){
799            //Some arrays have values we wish to exclude
800            if (isset($fields_to_exclude[$lname])){
801                foreach($fields_to_exclude[$lname] as $exclude_field){
802                    unset($temp_result_arr[$exclude_field]);
803                }
804            }
805        }
806
807        //return temp ordered list
808        return $temp_result_arr;
809    }
810
811    //if no array was passed in, pass back either the list of ordered columns by module, or the entireorder array
812    if(empty($name)){
813        return $field_order_array;
814    }else{
815        return $field_order_array[strtolower($name)];
816    }
817
818}
819?>