2 require_once('modules/MySettings/StoreQuery.php');
4 class Bug42915Test extends Sugar_PHPUnit_Framework_TestCase
6 var $previousCurrentUser;
9 public function setUp()
12 $this->previousCurrentUser = $current_user;
13 $this->saved_search_id = md5(gmmktime());
14 $current_user = SugarTestUserUtilities::createAnonymousUser();
15 $current_user->setPreference('num_grp_sep', ',', 0, 'global');
16 $current_user->setPreference('dec_sep', '.', 0, 'global');
17 $current_user->save();
19 //Force reset on dec_sep and num_grp_sep because the dec_sep and num_grp_sep values are stored as static variables
20 get_number_seperators(true);
22 $GLOBALS['db']->query("INSERT INTO saved_search (id, name, search_module, deleted, date_entered, date_modified, assigned_user_id, contents) VALUES ('" . $this->saved_search_id . "', 'Bug42738', 'Opportunities', 0, '2011-03-10 17:05:27', '2011-03-10 17:05:27', '".$GLOBALS["current_user"]->id."', 'YTozNjp7czoxMzoic2VhcmNoRm9ybVRhYiI7czoxNToiYWR2YW5jZWRfc2VhcmNoIjtzOjU6InF1ZXJ5IjtzOjQ6InRydWUiO3M6MTM6Im5hbWVfYWR2YW5jZWQiO3M6MDoiIjtzOjIxOiJhY2NvdW50X25hbWVfYWR2YW5jZWQiO3M6MDoiIjtzOjI4OiJhbW91bnRfYWR2YW5jZWRfcmFuZ2VfY2hvaWNlIjtzOjc6ImJldHdlZW4iO3M6MjE6InJhbmdlX2Ftb3VudF9hZHZhbmNlZCI7czowOiIiO3M6Mjc6InN0YXJ0X3JhbmdlX2Ftb3VudF9hZHZhbmNlZCI7ZDo5NTAwMDtzOjI1OiJlbmRfcmFuZ2VfYW1vdW50X2FkdmFuY2VkIjtkOjQ5NTAwO3M6MjA6ImRhdGVfY2xvc2VkX2FkdmFuY2VkIjtzOjA6IiI7czoxODoibmV4dF9zdGVwX2FkdmFuY2VkIjtzOjA6IiI7czo0MzoidXBkYXRlX2ZpZWxkc190ZWFtX25hbWVfYWR2YW5jZWRfY29sbGVjdGlvbiI7czowOiIiO3M6MzI6InRlYW1fbmFtZV9hZHZhbmNlZF9uZXdfb25fdXBkYXRlIjtzOjU6ImZhbHNlIjtzOjMxOiJ0ZWFtX25hbWVfYWR2YW5jZWRfYWxsb3dfdXBkYXRlIjtzOjA6IiI7czozNToidGVhbV9uYW1lX2FkdmFuY2VkX2FsbG93ZWRfdG9fY2hlY2siO3M6NToiZmFsc2UiO3M6MzE6InRlYW1fbmFtZV9hZHZhbmNlZF9jb2xsZWN0aW9uXzAiO3M6MDoiIjtzOjM0OiJpZF90ZWFtX25hbWVfYWR2YW5jZWRfY29sbGVjdGlvbl8wIjtzOjA6IiI7czoyMzoidGVhbV9uYW1lX2FkdmFuY2VkX3R5cGUiO3M6MzoiYW55IjtzOjIzOiJmYXZvcml0ZXNfb25seV9hZHZhbmNlZCI7czoxOiIwIjtzOjk6InNob3dTU0RJViI7czoyOiJubyI7czoxMzoic2VhcmNoX21vZHVsZSI7czoxMzoiT3Bwb3J0dW5pdGllcyI7czoxOToic2F2ZWRfc2VhcmNoX2FjdGlvbiI7czo0OiJzYXZlIjtzOjE0OiJkaXNwbGF5Q29sdW1ucyI7czo4OToiTkFNRXxBQ0NPVU5UX05BTUV8U0FMRVNfU1RBR0V8QU1PVU5UX1VTRE9MTEFSfERBVEVfQ0xPU0VEfEFTU0lHTkVEX1VTRVJfTkFNRXxEQVRFX0VOVEVSRUQiO3M6ODoiaGlkZVRhYnMiO3M6OTM6Ik9QUE9SVFVOSVRZX1RZUEV8TEVBRF9TT1VSQ0V8TkVYVF9TVEVQfFBST0JBQklMSVRZfENSRUFURURfQllfTkFNRXxURUFNX05BTUV8TU9ESUZJRURfQllfTkFNRSI7czo3OiJvcmRlckJ5IjtzOjQ6Ik5BTUUiO3M6OToic29ydE9yZGVyIjtzOjM6IkFTQyI7czoxNjoic3VnYXJfdXNlcl90aGVtZSI7czo1OiJTdWdhciI7czoxMzoiTW9kdWxlQnVpbGRlciI7czoxNToiaGVscEhpZGRlbj10cnVlIjtzOjEzOiJDb250YWN0c19kaXZzIjtzOjEwOiJxdW90ZXNfdj0jIjtzOjIyOiJzdWdhcl90aGVtZV9nbV9jdXJyZW50IjtzOjM6IkFsbCI7czoxNToiZ2xvYmFsTGlua3NPcGVuIjtzOjQ6InRydWUiO3M6Mjc6IlNRTGl0ZU1hbmFnZXJfY3VycmVudExhbmd1ZSI7czoxOiIyIjtzOjQ2OiJzdGFydF9yYW5nZV9hbW91bnRfYWR2YW5jZWRfdW5mb3JtYXR0ZWRfbnVtYmVyIjtiOjE7czo0Mzoic3RhcnRfcmFuZ2VfYW1vdW50X2FkdmFuY2VkX2N1cnJlbmN5X3N5bWJvbCI7czoxOiIkIjtzOjQ0OiJlbmRfcmFuZ2VfYW1vdW50X2FkdmFuY2VkX3VuZm9ybWF0dGVkX251bWJlciI7YjoxO3M6NDE6ImVuZF9yYW5nZV9hbW91bnRfYWR2YW5jZWRfY3VycmVuY3lfc3ltYm9sIjtzOjE6IiQiO3M6ODoiYWR2YW5jZWQiO2I6MTt9')");
25 public function tearDown()
27 $GLOBALS['db']->query("DELETE FROM saved_search where id = '{$this->saved_search_id}'");
28 SugarTestUserUtilities::removeAllCreatedAnonymousUsers();
30 $current_user = $this->previousCurrentUser;
34 public function testSaveNumericFields()
37 require_once('modules/SavedSearch/SavedSearch.php');
38 $focus = new SavedSearch();
39 $focus->retrieve($this->saved_search_id);
40 $_REQUEST = unserialize(base64_decode($focus->contents));
41 $_REQUEST['start_range_amount_advanced'] = '$9,500.00';
42 $_REQUEST['end_range_amount_advanced'] = '$49,500.00';
44 $mockBean = new Bug42915MockOpportunity();
45 $focus->handleSave('', false, '', $this->saved_search_id, $mockBean);
47 //Now retrieve what we have saved and test
48 $focus->retrieveSavedSearch($this->saved_search_id);
49 $formatted_data = $focus->contents;
51 $this->assertEquals(9500, $formatted_data['start_range_amount_advanced'], "Assert that value is unformatted value 9500");
52 $this->assertEquals(49500, $formatted_data['end_range_amount_advanced'], "Assert that value is unformatted value 49500");
54 $focus->populateRequest();
55 $this->assertEquals('$9,500.00', $_REQUEST['start_range_amount_advanced'], "Assert that value is formatted value $9,500.00");
56 $this->assertEquals('$49,500.00', $_REQUEST['end_range_amount_advanced'], "Assert that value is formatted value $49,500.00");
58 $current_user->setPreference('num_grp_sep', '.');
59 $current_user->setPreference('dec_sep', ',');
60 $current_user->save();
61 //Force reset on dec_sep and num_grp_sep because the dec_sep and num_grp_sep values are stored as static variables
62 get_number_seperators(true);
64 $focus = new SavedSearch();
65 $focus->retrieveSavedSearch($this->saved_search_id);
66 $focus->populateRequest();
67 $this->assertEquals('$9.500,00', $_REQUEST['start_range_amount_advanced'], "Assert that value is formatted value $9,500.00");
68 $this->assertEquals('$49.500,00', $_REQUEST['end_range_amount_advanced'], "Assert that value is formatted value $49,500.00");
70 //Okay so now what happens if they don't specify currency or separator or decimal values?
71 $_REQUEST['start_range_amount_advanced'] = '9500';
72 $_REQUEST['end_range_amount_advanced'] = '49500';
74 //Well then the populated values should be unformatted!
75 $focus->handleSave('', false, '', $this->saved_search_id, $mockBean);
76 $focus->retrieveSavedSearch($this->saved_search_id);
77 $focus->populateRequest();
78 $this->assertEquals(9500, $_REQUEST['start_range_amount_advanced'], "Assert that value is unformatted value 9500");
79 $this->assertEquals(49500, $_REQUEST['end_range_amount_advanced'], "Assert that value is unformatted value 49500");
83 public function testStoreQuerySaveAndPopulate()
85 global $current_user, $timedate;
87 $storeQuery = new StoreQuery();
88 //Simulate a search request here
91 'module' => 'Opportunities',
93 'searchFormTab' => 'advanced_search',
95 'name_advanced' => '',
96 'account_name_advanced' => '',
97 'amount_advanced_range_choice' => '=',
98 'range_amount_advanced' => '',
99 'start_range_amount_advanced' => '$9,500.00',
100 'end_range_amount_advanced' => '$45,900.00',
101 'date_closed_advanced_range_choice' => '=',
102 'range_date_closed_advanced' => '',
103 'start_range_date_closed_advanced' => '',
104 'end_range_date_closed_advanced' => '',
105 'next_step_advanced' => '',
106 'update_fields_team_name_advanced_collection' => '',
107 'team_name_advanced_new_on_update' => false,
108 'team_name_advanced_allow_update' => '',
109 'team_name_advanced_allowed_to_check' => false,
110 'team_name_advanced_collection_0' => '',
111 'id_team_name_advanced_collection_0' => '',
112 'team_name_advanced_type' => 'any',
113 'favorites_only_advanced' => 0,
115 'saved_search_name' => '',
116 'search_module' => '',
117 'saved_search_action' => '',
118 'displayColumns' => 'NAME|ACCOUNT_NAME|SALES_STAGE|AMOUNT_USDOLLAR|DATE_CLOSED|ASSIGNED_USER_NAME|DATE_ENTERED',
119 'hideTabs' => 'OPPORTUNITY_TYPE|LEAD_SOURCE|NEXT_STEP|PROBABILITY|CREATED_BY_NAME|TEAM_NAME|MODIFIED_BY_NAME',
121 'sortOrder' => 'ASC',
122 'button' => 'Search',
123 'saved_search_select' => '_none',
124 'sugar_user_theme' => 'Sugar',
125 'ModuleBuilder' => 'helpHidden=true',
126 'Contacts_divs' => 'quotes_v=#',
127 'sugar_theme_gm_current' => 'All',
128 'globalLinksOpen' => 'true',
129 'SQLiteManager_currentLangue' => '2',
130 'PHPSESSID' => 'b8e4b4b955ef3c4b29291779751b5fca',
133 $storeQuery->saveFromRequest('Opportunities');
135 $storedSearch = StoreQuery::getStoredQueryForUser('Opportunities');
136 $this->assertEquals($storedSearch['start_range_amount_advanced'], 9500.00, 'Assert that start range amount $9,500.00 was saved unformatted as 9500.00');
137 $this->assertEquals($storedSearch['end_range_amount_advanced'], 45900.00, 'Assert that end range amount $45,900.00 was saved unformatted as 45900.00');
140 //Test that value is converted to user's numer formatting
141 unset($_REQUEST['start_range_amount_advanced']);
142 unset($_REQUEST['end_range_amount_advanced']);
143 $storeQuery->loadQuery('Opportunities');
144 $storeQuery->populateRequest();
145 $this->assertTrue(isset($_REQUEST['start_range_amount_advanced']), 'Assert that the start_range_amount_advanced field was correctly populated');
146 $this->assertEquals('$9,500.00', $_REQUEST['start_range_amount_advanced'], 'Assert that start_range_amount_advanced value was converted to $9,500.00');
147 $this->assertTrue(isset($_REQUEST['end_range_amount_advanced']), 'Assert that the end_range_amount_advanced field was correctly populated');
148 $this->assertEquals('$45,900.00', $_REQUEST['end_range_amount_advanced'], 'Assert that end_range_amount_advanced value was converted to $45,900.00');
150 //Now say the user changes his number preferences and switches back to this StoredQuery
151 $current_user->setPreference('num_grp_sep', '.');
152 $current_user->setPreference('dec_sep', ',');
153 $current_user->save();
154 //Force reset on dec_sep and num_grp_sep because the dec_sep and num_grp_sep values are stored as static variables
155 get_number_seperators(true);
157 //Now when we reload this store query, the $_REQUEST array should be populated with new user date preference
158 unset($_REQUEST['start_range_amount_advanced']);
159 unset($_REQUEST['end_range_amount_advanced']);
160 $storeQuery->loadQuery('Opportunities');
161 $storeQuery->populateRequest();
162 $this->assertTrue(isset($_REQUEST['start_range_amount_advanced']), 'Assert that the start_range_amount_advanced field was correctly populated');
163 $this->assertEquals('$9.500,00', $_REQUEST['start_range_amount_advanced'], 'Assert that start_range_amount_advanced value was converted to $9.500,00');
164 $this->assertTrue(isset($_REQUEST['end_range_amount_advanced']), 'Assert that the end_range_amount_advanced field was correctly populated');
165 $this->assertEquals('$45.900,00', $_REQUEST['end_range_amount_advanced'], 'Assert that end_range_amount_advanced value was converted to $45.900,00');
167 //Okay so now what happens if they don't specify currency or separator or decimal values?
168 $_REQUEST['start_range_amount_advanced'] = 9500;
169 $_REQUEST['end_range_amount_advanced'] = 45900;
171 $storeQuery->saveFromRequest('Opportunities');
172 $storeQuery->loadQuery('Opportunities');
173 $storeQuery->populateRequest();
174 $this->assertTrue(isset($_REQUEST['start_range_amount_advanced']), 'Assert that the start_range_amount_advanced field was correctly populated');
175 $this->assertEquals(9500, $_REQUEST['start_range_amount_advanced'], 'Assert that start_range_amount_advanced value remained as is (9500)');
176 $this->assertTrue(isset($_REQUEST['end_range_amount_advanced']), 'Assert that the end_range_amount_advanced field was correctly populated');
177 $this->assertEquals(45900, $_REQUEST['end_range_amount_advanced'], 'Assert that end_range_amount_advanced value remained as is (45900)');
184 class Bug42915MockOpportunity extends Opportunity
187 var $field_defs = array (
194 'reportable' => true,
195 'comment' => 'Unique identifier',
200 'vname' => 'LBL_OPPORTUNITY_NAME',
202 'dbType' => 'varchar',
204 'unified_search' => true,
205 'comment' => 'Name of the opportunity',
206 'merge_filter' => 'selected',
207 'importable' => 'required',
212 'name' => 'date_entered',
213 'vname' => 'LBL_DATE_ENTERED',
214 'type' => 'datetime',
215 'group' => 'created_by_name',
216 'comment' => 'Date record created',
217 'enable_range_search' => '1',
218 'options' => 'date_range_search_dom',
222 'name' => 'date_modified',
223 'vname' => 'LBL_DATE_MODIFIED',
224 'type' => 'datetime',
225 'group' => 'modified_by_name',
226 'comment' => 'Date record last modified',
227 'enable_range_search' => '1',
228 'options' => 'date_range_search_dom',
230 'modified_user_id' =>
232 'name' => 'modified_user_id',
233 'rname' => 'user_name',
234 'id_name' => 'modified_user_id',
235 'vname' => 'LBL_MODIFIED',
236 'type' => 'assigned_user_name',
239 'group' => 'modified_by_name',
241 'reportable' => true,
242 'comment' => 'User who last modified record',
244 'modified_by_name' =>
246 'name' => 'modified_by_name',
247 'vname' => 'LBL_MODIFIED_NAME',
249 'reportable' => false,
250 'source' => 'non-db',
251 'rname' => 'user_name',
253 'id_name' => 'modified_user_id',
255 'link' => 'modified_user_link',
256 'duplicate_merge' => 'disabled',
260 'name' => 'created_by',
261 'rname' => 'user_name',
262 'id_name' => 'modified_user_id',
263 'vname' => 'LBL_CREATED',
264 'type' => 'assigned_user_name',
268 'group' => 'created_by_name',
269 'comment' => 'User who created record',
273 'name' => 'created_by_name',
274 'vname' => 'LBL_CREATED',
276 'reportable' => false,
277 'link' => 'created_by_link',
278 'rname' => 'user_name',
279 'source' => 'non-db',
281 'id_name' => 'created_by',
283 'duplicate_merge' => 'disabled',
284 'importable' => 'false',
288 'name' => 'description',
289 'vname' => 'LBL_DESCRIPTION',
291 'comment' => 'Full text of the note',
298 'vname' => 'LBL_DELETED',
301 'reportable' => false,
302 'comment' => 'Record deletion indicator',
306 'name' => 'created_by_link',
308 'relationship' => 'opportunities_created_by',
309 'vname' => 'LBL_CREATED_USER',
310 'link_type' => 'one',
312 'bean_name' => 'User',
313 'source' => 'non-db',
315 'modified_user_link' =>
317 'name' => 'modified_user_link',
319 'relationship' => 'opportunities_modified_user',
320 'vname' => 'LBL_MODIFIED_USER',
321 'link_type' => 'one',
323 'bean_name' => 'User',
324 'source' => 'non-db',
326 'assigned_user_id' =>
328 'name' => 'assigned_user_id',
329 'rname' => 'user_name',
330 'id_name' => 'assigned_user_id',
331 'vname' => 'LBL_ASSIGNED_TO_ID',
332 'group' => 'assigned_user_name',
336 'reportable' => true,
340 'comment' => 'User ID assigned to record',
341 'duplicate_merge' => 'disabled',
343 'assigned_user_name' =>
345 'name' => 'assigned_user_name',
346 'link' => 'assigned_user_link',
347 'vname' => 'LBL_ASSIGNED_TO_NAME',
348 'rname' => 'user_name',
350 'reportable' => false,
351 'source' => 'non-db',
353 'id_name' => 'assigned_user_id',
355 'duplicate_merge' => 'disabled',
357 'assigned_user_link' =>
359 'name' => 'assigned_user_link',
361 'relationship' => 'opportunities_assigned_user',
362 'vname' => 'LBL_ASSIGNED_TO_USER',
363 'link_type' => 'one',
365 'bean_name' => 'User',
366 'source' => 'non-db',
367 'duplicate_merge' => 'enabled',
368 'rname' => 'user_name',
369 'id_name' => 'assigned_user_id',
375 'vname' => 'LBL_TEAM_ID',
376 'group' => 'team_name',
377 'reportable' => false,
379 'type' => 'team_list',
381 'comment' => 'Team ID for the account',
385 'name' => 'team_set_id',
387 'id_name' => 'team_set_id',
388 'vname' => 'LBL_TEAM_SET_ID',
396 'name' => 'team_count',
397 'rname' => 'team_count',
398 'id_name' => 'team_id',
399 'vname' => 'LBL_TEAMS',
400 'join_name' => 'ts1',
405 'link' => 'team_count_link',
406 'massupdate' => false,
408 'source' => 'non-db',
409 'importable' => 'false',
410 'reportable' => false,
411 'duplicate_merge' => 'disabled',
417 'name' => 'team_name',
418 'db_concat_fields' =>
423 'sort_on' => 'tj.name',
426 'id_name' => 'team_id',
427 'vname' => 'LBL_TEAMS',
432 'link' => 'team_link',
433 'massupdate' => false,
434 'dbType' => 'varchar',
435 'source' => 'non-db',
437 'custom_type' => 'teamset',
441 'name' => 'team_link',
443 'relationship' => 'opportunities_team',
444 'vname' => 'LBL_TEAMS_LINK',
445 'link_type' => 'one',
447 'bean_name' => 'Team',
448 'source' => 'non-db',
449 'duplicate_merge' => 'disabled',
454 'name' => 'team_count_link',
456 'relationship' => 'opportunities_team_count_relationship',
457 'link_type' => 'one',
459 'bean_name' => 'TeamSet',
460 'source' => 'non-db',
461 'duplicate_merge' => 'disabled',
462 'reportable' => false,
469 'relationship' => 'opportunities_teams',
470 'bean_filter_field' => 'team_set_id',
471 'rhs_key_override' => true,
472 'source' => 'non-db',
473 'vname' => 'LBL_TEAMS',
474 'link_class' => 'TeamSetLink',
475 'link_file' => 'modules/Teams/TeamSetLink.php',
477 'reportable' => false,
479 'opportunity_type' =>
481 'name' => 'opportunity_type',
482 'vname' => 'LBL_TYPE',
484 'options' => 'opportunity_type_dom',
487 'comment' => 'Type of opportunity (ex: Existing, New)',
488 'merge_filter' => 'enabled',
492 'name' => 'account_name',
494 'id_name' => 'account_id',
495 'vname' => 'LBL_ACCOUNT_NAME',
497 'table' => 'accounts',
498 'join_name' => 'accounts',
500 'module' => 'Accounts',
501 'dbType' => 'varchar',
502 'link' => 'accounts',
504 'source' => 'non-db',
505 'unified_search' => true,
507 'importable' => 'required',
511 'name' => 'account_id',
512 'vname' => 'LBL_ACCOUNT_ID',
514 'source' => 'non-db',
519 'name' => 'campaign_id',
520 'comment' => 'Campaign that generated lead',
521 'vname' => 'LBL_CAMPAIGN_ID',
525 'table' => 'campaigns',
527 'module' => 'Campaigns',
528 'reportable' => false,
529 'massupdate' => false,
530 'duplicate_merge' => 'disabled',
534 'name' => 'campaign_name',
536 'id_name' => 'campaign_id',
537 'vname' => 'LBL_CAMPAIGN',
539 'link' => 'campaign_opportunities',
541 'table' => 'campaigns',
542 'module' => 'Campaigns',
543 'source' => 'non-db',
545 'campaign_opportunities' =>
547 'name' => 'campaign_opportunities',
549 'vname' => 'LBL_CAMPAIGN_OPPORTUNITY',
550 'relationship' => 'campaign_opportunities',
551 'source' => 'non-db',
555 'name' => 'lead_source',
556 'vname' => 'LBL_LEAD_SOURCE',
558 'options' => 'lead_source_dom',
560 'comment' => 'Source of the opportunity',
561 'merge_filter' => 'enabled',
566 'vname' => 'LBL_AMOUNT',
567 'type' => 'currency',
568 'dbType' => 'double',
569 'comment' => 'Unconverted amount of the opportunity',
570 'duplicate_merge' => 'disabled',
571 'importable' => 'required',
573 'options' => 'numeric_range_search_dom',
574 'enable_range_search' => '1',
578 'name' => 'amount_usdollar',
579 'vname' => 'LBL_AMOUNT_USDOLLAR',
580 'type' => 'currency',
582 'dbType' => 'double',
583 'disable_num_format' => true,
585 'comment' => 'Formatted amount of the opportunity',
589 'name' => 'currency_id',
591 'group' => 'currency_id',
592 'vname' => 'LBL_CURRENCY',
595 'name' => 'getCurrencyDropDown',
598 'reportable' => false,
599 'comment' => 'Currency used for display purposes',
603 'name' => 'currency_name',
605 'id_name' => 'currency_id',
606 'vname' => 'LBL_CURRENCY_NAME',
609 'table' => 'currencies',
610 'module' => 'Currencies',
611 'source' => 'non-db',
614 'name' => 'getCurrencyNameDropDown',
618 'duplicate_merge' => 'disabled',
622 'name' => 'currency_symbol',
624 'id_name' => 'currency_id',
625 'vname' => 'LBL_CURRENCY_SYMBOL',
628 'table' => 'currencies',
629 'module' => 'Currencies',
630 'source' => 'non-db',
633 'name' => 'getCurrencySymbolDropDown',
637 'duplicate_merge' => 'disabled',
641 'name' => 'date_closed',
642 'vname' => 'LBL_DATE_CLOSED',
645 'comment' => 'Expected or actual date the oppportunity will close',
646 'importable' => 'required',
648 'enable_range_search' => '1',
649 'options' => 'date_range_search_dom',
653 'name' => 'next_step',
654 'vname' => 'LBL_NEXT_STEP',
657 'comment' => 'The next step in the sales process',
658 'merge_filter' => 'enabled',
662 'name' => 'sales_stage',
663 'vname' => 'LBL_SALES_STAGE',
665 'options' => 'sales_stage_dom',
668 'comment' => 'Indication of progression towards closure',
669 'merge_filter' => 'enabled',
670 'importable' => 'required',
675 'name' => 'probability',
676 'vname' => 'LBL_PROBABILITY',
678 'dbType' => 'double',
680 'comment' => 'The probability of closure',
687 'merge_filter' => 'enabled',
691 'name' => 'accounts',
693 'relationship' => 'accounts_opportunities',
694 'source' => 'non-db',
695 'link_type' => 'one',
696 'module' => 'Accounts',
697 'bean_name' => 'Account',
698 'vname' => 'LBL_ACCOUNTS',
702 'name' => 'contacts',
704 'relationship' => 'opportunities_contacts',
705 'source' => 'non-db',
706 'module' => 'Contacts',
707 'bean_name' => 'Contact',
713 'options' => 'opportunity_relationship_type_dom',
716 'vname' => 'LBL_CONTACTS',
722 'relationship' => 'opportunity_tasks',
723 'source' => 'non-db',
724 'vname' => 'LBL_TASKS',
730 'relationship' => 'opportunity_notes',
731 'source' => 'non-db',
732 'vname' => 'LBL_NOTES',
736 'name' => 'meetings',
738 'relationship' => 'opportunity_meetings',
739 'source' => 'non-db',
740 'vname' => 'LBL_MEETINGS',
746 'relationship' => 'opportunity_calls',
747 'source' => 'non-db',
748 'vname' => 'LBL_CALLS',
754 'relationship' => 'emails_opportunities_rel',
755 'source' => 'non-db',
756 'vname' => 'LBL_EMAILS',
760 'name' => 'documents',
762 'relationship' => 'documents_opportunities',
763 'source' => 'non-db',
764 'vname' => 'LBL_DOCUMENTS_SUBPANEL_TITLE',
770 'relationship' => 'quotes_opportunities',
771 'source' => 'non-db',
772 'vname' => 'LBL_QUOTES',
778 'relationship' => 'projects_opportunities',
779 'source' => 'non-db',
780 'vname' => 'LBL_PROJECTS',
786 'relationship' => 'opportunity_leads',
787 'source' => 'non-db',
788 'vname' => 'LBL_LEADS',
792 'name' => 'campaigns',
794 'relationship' => 'opportunities_campaign',
795 'module' => 'CampaignLog',
796 'bean_name' => 'CampaignLog',
797 'source' => 'non-db',
798 'vname' => 'LBL_CAMPAIGNS',
802 'name' => 'campaign_link',
804 'relationship' => 'opportunities_campaign',
805 'vname' => 'LBL_CAMPAIGNS',
806 'link_type' => 'one',
807 'module' => 'Campaigns',
808 'bean_name' => 'Campaign',
809 'source' => 'non-db',
813 'name' => 'currencies',
815 'relationship' => 'opportunity_currencies',
816 'source' => 'non-db',
817 'vname' => 'LBL_CURRENCIES',
821 'name' => 'contracts',
823 'vname' => 'LBL_CONTRACTS',
824 'relationship' => 'contracts_opportunities',
825 'source' => 'non-db',
829 'options' => 'date_range_search_dom',
830 'enforced' => 'false',
832 'enable_range_search' => '1',
834 'source' => 'custom_fields',
835 'name' => 'customdate_c',
836 'vname' => 'LBL_CUSTOMDATE',
842 'importable' => 'true',
843 'duplicate_merge' => 'disabled',
844 'duplicate_merge_dom_value' => '0',
846 'reportable' => true,
847 'calculated' => false,
849 'id' => 'Opportunitiescustomdate_c',
850 'custom_module' => 'Opportunities',
852 'customdatetime_c' =>
854 'enforced' => 'false',
857 'source' => 'custom_fields',
858 'name' => 'customdatetime_c',
859 'vname' => 'LBL_CUSTOMDATETIME',
860 'type' => 'datetimecombo',
865 'importable' => 'true',
866 'duplicate_merge' => 'disabled',
867 'duplicate_merge_dom_value' => '0',
869 'reportable' => true,
870 'calculated' => false,
872 'enable_range_search' => false,
873 'dbType' => 'datetime',
874 'id' => 'Opportunitiescustomdatetime_c',
875 'custom_module' => 'Opportunities',