Tuesday, December 31, 2013

Chatter in Communities

Salesforce Communities is add-on feature for Salesforce user to connect directly with their resellers, distributors, and partners. Salesforce Communities generally available on Summer '13 release, early it is called Salesforce Partner Portal, but out of the box Communities have more features.

One of the most important Communities feature (compare to Portal) is availability of Chatter, where Salesforce user can collaborate directly with their Partner user directly via Chatter.

If you just setup Chatter in Communities and found that Communities user cannot see Salesforce internal user in Chatter, this is because security issue related to user sharing. There are few ways to enable this:

1. Sharing Setting
By default Organization-Wide Defaults for User object for Default External Access is Private, this is why partner user will not able to see internal user. If you change this to Public Read Only, this will allow all partner user in any communities to see all internal users.

2. User Sharing Rules
Create new sharing rule for Portal user to have read-only access to internal user. You can determine which portal roles (and subordinates) able to see which internal user or external user, by Role or Public Group

3. Manual Sharing
This process to manually share each users visible to which Partner role. Go to User detail page and click Sharing button, then specify Partner users (by Role or Public Group or All) able to see that particular user. In screenshot below, Steve is the only user shared to Partner using manual sharing.

Note: if you do not see User object Sharing Setting or Sharing button in User detail:
  • Make sure you have setup Communities, from: Setup - Customize - Communities - Settings
  • Contact Salesforce support to enable it


Sunday, December 29, 2013

Salesforce: Dashboard with four-column table

Table is one of the component type available for dashboard. By default, tables show only two columns of data, but you can modify it up to 4 columns of data.

You can also personalize the table and show users’ Chatter photos as long as the table doesn’t have more than 20 rows.

Here are few items to note in customizing table columns:
  1. Make sure the source report is in matrix or summary format 
  2. Make sure the source report contains a chart
  3. Fields available to use in the table depends on the fields picked in the chart of source report 
  4. The chart in source report must contain groupings and at least one summary
  5. The first grouping in the report (not in chart) becomes the first column of the table.
  6. Use vertical bar chart in the report to make more fields available for the table.
  7. Click Customize table in table to add more columns (default only 2)

Sample 1

Sample 2

1. Customized tables will allow null values in the results. The Default two-column tables do not.
2. You can have the following combinations:
     2 grouped fields and 1 number
     2 grouped fields and 2 numbers
     1 grouped field and 2 numbers
     1 grouped field and 3 numbers. (Although we can do one grouping and three summaries, not all the summaries may be added. We cannot set different data type.)
     Not have 3 grouped fields and 1 number
3. Can’t sort by 2nd groupings


Saturday, December 28, 2013

Salesforce: Lead Conversion Validation Rule

We blog on lead field conversion mapping sometimes back this year. In this blog, we would like to discuss how to run Validation Rules on Lead conversion process, this mean to block Lead conversion if not satisfy any rules. Few items to check:

1. Require Validation for Converted Leads
Earlier this option is called as Enforce Validation and Triggers from Lead Convert. Make sure this setting is enabled, otherwise Validation Rule on Lead conversion will be ignored. Go to Setup - Customize - Leads - Settings, enable Require Validation for Converted Leads. If you do not see this option, log a case with Salesforce support to get this option enable for you.

When this checkbox selected, it will check all validation rules in related objects of Lead conversion, including: Lead, Account, Contact and Opportunity (if Do not create a new opportunity upon conversion is not checked).

2. Set Validation Rule in Lead object
Use Case: company would like to stop lead conversion when Title is blank.
Here we go:
  • Create a validation rule in Lead using formula IsConverted
  • Make sure the rule is Active, many people forget to activate it and spend a lot of times before realize it is not active.

3. Set Validation Rule in target object
Target object here is Account, Contact and Opportunity
Use Case: company would like to block Account without website.
Although it is possible to create the rule in Lead, but if the validation rule in Account level, even you skip it in Lead object validation rule, validation rule in Account will take care for this.

When you have validation rule in both target, example: Account and Lead object with checking IsConverted, Account validation rule will kick-in before Lead validation rule with checking IsConverted field. This make sense because Salesforce will create / update Account before update Lead with IsConverted = True.


Friday, December 27, 2013

Salesforce: NO Email Alert action for Task & Event workflow


Normally, in Salesforce workflow, we can add action:
  • Create Task
  • Send Email Alert
  • Field Update
  • Send Outbound Message
But, if you realize (until release Summer '14 release) for workflow object Event and Task, there is NO Email Alert option for action.

Here is normal action for workflow:

And this screenshot on Event or Task, notice that "New Email Alert" is not there.

This limitation has aware for quite long time, and someone has posted this in IdeaExchange, you are please to vote from here (currently it have 2670 points for this idea).


1. Create Workflow + New Task action 
This option may not be a nice, it will create another new task just to email user when Workflow on Task or Event triggered. You need to tick Notify Assignee in the task for Workflow.

2. Use AppExchange product - iTools Delegated Tasks Management
This is not a free product -

3. Write Apex Trigger
Here a sample code for this.

Thursday, December 26, 2013

Update Salesforce using JavaScript AJAX Toolkit

For you who are not from developer background, don't be afraid with the title of this blog, this is not about how to write JavaScript blog. But, using a simple script provided with Ajax Toolkit, you can make use of it for your business needs in Salesforce area.

Use Case:
To change Account Type from Prospect to Customer via a button click, and Customer value itself maybe not a picklist in the account type.

Create a custom button in Account object. Here we go:
  1. Navigate to Setup | Customize | Accounts | Buttons, Links, and Actions
  2. Click New Button or Link, select Detail Page Button in Display Type, and in Behavior select Execute JavaScript
  3. Paste script below
  4. Add custom button created to the Account page layout.
  5. Done - simple ?
The script:
 var AccObj = new sforce.SObject("Account");  
 AccObj.Id = '{!Account.Id}';  
 AccObj.Type = 'Customer';  
 var result = sforce.connection.update([AccObj]);  

Further tweak, you also can differentiate Customer record type with Prospect record type, so in the script above, add one line to change Account Record Type with Customer Record Type Id, then assign different Page Layout for Customer.

Salesforce Last Login report using Date Value

Last month we wrote a blog of using LAST_WEEK ; LAST_N_DAYS:n ; N_DAYS_AGO:n for SOQL query, it is simple and very powerful to query Salesforce data dynamically.

The same we can implement for report and view. This blog will discuss using Relative Date Value, such as: Yesterday, Today, Tomorrow, This Week, Last Week, etc (for complete value, refer to this Salesforce documentation) in report and how to choose date value to use. We'll use Last n Months versus Last n Days for sample.

Use Case:
VP of IT would like to understand users not login to Salesforce in last 60 days.

Using Salesforce report, we can easily create a report, by selecting Users report type (make sure you have admin privileges).

Add a filter in the report Last Login not equal to LAST 60 DAYS and done. This report will show all users never login + users not login within last 60 days.

If you tweak the filter to Last Login not equal to LAST 2 MONTHS, surprisingly you will get very different result. 

Let us analyze, example today is 26 Dec 2013:
  • Using "not equal to LAST 2 MONTHS", will show users never login + users last login = Dec '13, because last 2 months in this scenario is Oct '13 & Nov '13. 
  • Using "not equal to Last 60 DAYS", will return users never login + users login before 27 Oct '13.
Make sense? Hope this help.

ReferenceUnderstanding Relative Date Values for Filter Criteria

Wednesday, December 18, 2013

Can we sort Salesforce Activity History?

Can we sort Salesforce Activity History? Until Summer '14 release, users cannot sort related list manually (including Activity History), and admin also not able to change the default sort. Activity History is always sorted by Due Date (or ActivityDate in API name) in descending order. It will not consider the created date or modified date in the sort order.

Here is a clear example of Activity History with the same Due Date:

Then, we edit item 2 and 3, we change the Due Date for item 2 to 8/23 and item 3 to 8/25, it will be re-sort with Due Date desc.

Remember Due Date is just a date, no time stamp, so if you have multiple activity history created at the same date, it will not order by created or last modified date time

But, we have a workaround, here we go:

1. Create Custom Button in Task
Setup - Customize - Activities -  Task Buttons, Links, and Actions
Click "New Button or Link", then select Behavior, Content Source and URL as the screenshot below:

/007?id={!Account.Id}&rlid=RelatedHistoryList <-- this is for Account

2. Add Custom Button into Account or Contact or other object page layout
Edit the Layout, scroll to Related Lists and look for Activity History.
Click 'Related List Properties' icon, then click + in Buttons sections, add the button to the right panel

3. Save the Page Layout and Done.
User will see a new button added to 'Activity History' related list. When the user click the button, it will open a new page where the user will be able to sort by any fields.

In Winter '15 release, Salesforce introduce sorting Activity History by Last Modified Date in ascending order, but caused some inconsistency and this has been reverted the changes made in Winter 15.

Deploy Salesforce Profiles with Change Set

Is it possible to deploy Profile using Change Set?
As of now (Summer '16) release, you cannot deploy Profile as stand alone component in Change Set. But, you can include Profiles in the Change Set. What this mean? Components setting (such as: custom field, custom object, etc) related to Profile will be deployed correctly for that Profile, but bear in mind that it also will deploy profile setting for Administrative Permissions, General User Permissions, Login Hours, Login IP Ranges for the profiles.

My experience in deploying Profile with Change Set is still very challenging (even we know Salesforce is keep enhance it). As Profile is not a Change Set component, it will not allow you to upload just Profile. So, if you want to deploy Profile, the workaround is to add a component to the Change Set, such as: custom field or others, then include the profile in Profile Settings For Included Components.

Below settings in Profile need be configure manually in target organization after change set deployed, if the corresponding components are not deployed in the same change set, example: you have a custom object called Invoice and profile called Sales, let's say Sales profile have Read, Create, Edit access to Invoice in source org., but if Sales profile is not included in the change set, Sales profile users will have no access to the Invoice object.
  • Standard Object Permissions
  • Custom Object Permissions
  • Field-Level Security
  • Tab Settings
  • Standard Object Layouts
  • Custom Object Layouts
  • Custom App Settings
  • Connected App Access
  • Record Type Settings
  • Apex Class Access
  • Visualforce Page Access

Following items will always deployed properly (overwrite target profile) in Profile when you include it, because it do not depend on other components:
  • Administrative Permissions
  • General User Permissions
  • Login Hours
  • Login IP Ranges

Profile not exist in target organization will be create, while existing profile will be overwritten (if the related components is in the change set). If you have a profile has been deleted in target instance, and you deploy Change Set with the same Profile name, deleted profile will be restored with all permissions before it is deleted.


Tuesday, December 17, 2013

Salesforce: Attachments roll-up to the related Account

Do you realize that attachments on a Task or Event that is related to an Account, Contact, or Opportunity, will roll-up to appear in the Notes & Attachments related list on the Account record.

See this screenshot:

  • First attachment: related to a task in Opportunity linked to Account
  • Second attachment: related directly to Account
  • Third attachment: related to an email (which is a task) in Contact that linked to Account
  • Fourth attachment: related to Contact
  • Fifth attachment: related to an email (which is a task) linked to Account
But, they do not appear in in the Notes & Attachments for Contact or Opportunity, is this something weird?

And the worst, this is not customizeable and even to customize the related list for Notes & Attachments.

See this document related to this in Salesforce knowledge.

Thursday, December 12, 2013

Salesforce: Close Case in one click

To close a Case in Salesforce, user need to have Edit permission on Case object. By default, when a user click Close Case button, user will be bring into a new page to enter information needed before close the case. Admin can set mandatory fields at the Close Case page, from Setup - Customize - Case - Page Layout and look for Case Close Page Layouts.

But, can we make this simple? Meaning just click a button to close an open case without have to open a new page. Yes, by using custom button. Here we go:
  1. Setup - Customize - CasesButtons, Links, and Actions
  2. Click New Button or Link, enter Label and Name, select Detail Page Button in Display Type and Behavior select Execute JavaScript
  3. Paste JavaScript script below
  4. Add custom button created to the page layout and remove default Close Case button, you can have multiple page layout with different button based on user profile and Case record type.
var caseObj = new sforce.SObject("Case");
caseObj.Id = '{!Case.Id}';
if ({!NOT(Case.IsClosed)}){
   caseObj.Status = 'Closed';
   var result = sforce.connection.update([caseObj]);
   if (result[0].success=='false') {
   } else {

Another option is to enable Closed value available in Case Status. By default, this value will be not available when user Create or Edit the Case, but we can enable it. Here we go: Setup - Customize - CasesSupport Settings, enable Show Closed Statuses in Case Status FieldThis will make Closed status available when user create or edit Case, user also will not bring into Case Close page any more.

In the same Case Support Setting page, admin also can hide Save & Close button by enable Hide Save & Close Button and Cls Links.

How about if I want to limit only certain profiles can close case?
Easy... create validation rule with this formula, sample:
RecordType.Name = 'CSD Case' && ISCHANGED(IsClosed) 

Read this document for more information on Closing Cases.

Page-level ad