Today's post is written by Andrew Monshizadeh, an iOS Developer at Sonoma Partners.
In the previous blog post, we discussed a situation where it would be beneficial to break parts of a Visualforce page and Apex backing into a Visualforce component. As a review, the benefit of Visualforce components is that they make it possible to prevent duplication of code. The less code there is overall, the easier it is to test and maintain.
At the end of the last blog post, the naïve approach to the Case and Case Comment list was implemented using a normal <apex:pageBlockTable> tag in the Visualforce page.
This example is simple. But it isn’t difficult to imagine that a client would want a Visualforce page that included a large number of fields, some for display and some editable, along with validation logic that needs to happen throughout the time the user is on the page, which would need to be done in the Apex controller. Though it would be possible to move the Case Comment based logic to a separate extension controller, this doesn’t solve the problem of truly breaking the code into a reusable chunk. The developer would still need to come back to this page and copy/paste the Visualforce.
Enter Visualforce components.
Visualforce components make it easier to reuse Visualforce and Apex code throughout the entire org. This is because it forces the developer to consider the behavior and content in the component as a stand-alone unit.
The first step to breaking out a component, is determining what exactly should be in the component. It is important at this point to try and determine the smallest set of content and behavior to break out. There is no benefit in carrying around excess baggage. So in this case, the developer would only be interested in the actual table displaying the Case Comments. For this simple example, it is possible to take the original Visualforce and move it into a new component, almost entirely unchanged.
Note that the component has its own backing Apex controller. This simplifies the logic within the component’s Visualforce markup because the backing controller can be developed to fit the needs of the component. Therefore, it is possible to contain just the list of Case Comments with no look ups necessary.
With this component defined, it is now possible to use it in the original Visualforce page in place of the normal table. This also simplifies the page’s controller, so much so in fact, that it is no longer necessary.
Figure 4 - Custom page block table but now in a component
Clearly this simplifies the overall Visualforce page development, and does not impact the user experience. Also, it means that this list of Case Comments may be used anywhere Visualforce is used (and an Account object is available) with a minimum amount of code. Finally, by making this a component, any time a change is made to the component that is reflected everywhere the component is used.
In our next and final Visualforce component post, we will discuss a few advanced uses for Visualforce components.
Like most users of Dynamics CRM 2013, it’s taking me awhile to get used to the new navigation. However, with any software deployment, it takes users time to get used to the new functionality and especially the new look and feel.
It’s hard to remember when CRM 2011 came out (way back almost 4 years ago now) and the introduction of the ribbon. What a crazy concept the ribbon was and how would we ever get used to it? However, after using 2011 over time (and honestly any Microsoft product), the ribbon became second nature. When Microsoft removed the ribbon in 2013, everyone complained it was missing. How would we now get used to not having a ribbon? I believe that over time Dynamics CRM 2013 and 2015 will fall into the same camp as 2011 where users will become comfortable using the new navigation and will have forgotten the ribbon ever existed.
We recently just upgraded our internal CRM deployment to 2015 and I’m forced to get used to the navigation even quicker than originally anticipated. Of course with every new release there are those learning curves and the questions you ask “why did they do it this way?” but the good news is that with Microsoft, they’re listening.
One of the biggest complaints of 2013 is the fact that the Advanced Find was buried and not readily available on the global tool bar like it was in 2011. In some areas of the application you couldn’t even initiate Advanced Find. And those areas where you could, you had to click on the ellipsis to bring down additional contextual menu items to find Advanced Find.
However, the good news is in 2015, Microsoft has listened to initial feedback from users of 2013, and have added the Advanced Find menu back in the global tool bar so that you can always initiate Advanced Find no matter where you are in the application. Enjoy!
Today's guest blogger is Chris LaBadie, a Senior Database Developer at Sonoma Partners
Whenever we work on a data project for a customer the subject of cleaning their client data is always a discussion point. The project could involve a migration from one CRM platform to another, integrating an ERP system into CRM, or even cleaning their data “in place”- but the message is usually the same, “we know we have duplicates in our data, help us clean it up!”
Anybody that has ever tried to track people or companies knows that it can be a huge challenge to avoid duplicate data. When you have multiple users maintaining data, it is very common to introduce duplicate data no matter the de-duplication safeguards your system uses.
Working with people-
• Names can be difficult to track (misspellings, maiden names, nicknames, etc).
• People move/change contact information.
• Even unique fields like address or email address can be shared amongst more than one person.
Working with companies-
• Abbreviations or acronyms in names can present a challenge.
• Companies can have multiple locations.
• Often use different addresses to track billing, shipping, etc.
In our experience, there isn’t a magic bullet to eliminate de-duplication. The best solution is usually a layered approach- use form validation to ensure quality data entry, intelligent system design to store records in an organized manner, and system de-duplication rules to search out potential duplicate data and present to a user records that might match the information they are attempting to enter.
However, a common project for Sonoma Partners is moving a client to a new CRM platform and an important part of migrating data to the new platform is to identify potential duplicate data before it ever reaches the new system. While this may sound like a large effort, it is actually pretty easy thanks to the Fuzzy Grouping functionality built into SQL Server Integration Services (SSIS).
Fuzzy Grouping allows SSIS to inspect a set of data and compare one or more fields in the dataset. Rather than comparing the field data, Fuzzy Grouping will match strings based on their sounds- giving more accurate results based on how a person would hear the string while overcoming misspellings, typos, abbreviations, nicknames, etc. Note, you will need SQL Server Enterprise or SQL Server Developer edition to use Fuzzy Grouping. This example is developed using the Business Intelligence Design Studio (BIDS) in SQL Server 2012.
In this demonstration we will process an Excel file of contacts. This file can be generated from any other system and used in a process like this to identify potential duplicate data before that data is migrated to CRM. The end result of this process is to produce a file containing potential duplicates so they can be reviewed and cleaned up in the source system before data migration.
Fuzzy Grouping evaluates the file of Contacts and compares them based on selected fields. Potentially duplicate records are grouped together and assigned a group number.
After Fuzzy Grouping, the process splits so it can sort the results based on their Fuzzy Grouping group number and count the number of records per group.
Finally, a step to check the group count determines which records are potential dupes- a group count of 1 means the record is unique, anything more than 1 means that group contains 1 or more records that should be reviewed. The potential duplicates are then exported to an Excel file for review.
Configuring Fuzzy Grouping is a pretty straight-forward process, just select the fields you want to compare and set the minimum amount of similarity (roughly a percentage of matching). This process can involve a little bit of trial and error while you fine-tune the Fuzzy Grouping to identify the records that are potential duplicates without letting through any false positives.
Typically we will start with lower minimums and go up until we are seeing the desired results.
When you run the process, you can see how many records it processes and how many records SSIS ultimately decided to export to Excel for review.
When the process is complete, you can view the results in your Excel file. Here you can see the unique record number assigned to the record (KeyIn), group number (KeyOut), overall score (percentage of match to the potential duplicate record), similarities for First Name/Last Name/City (percentage of match for each column), and the Group Count (number of potential duplicates per record group). The highlighted values in the screenshot show some of the values that were compared and demonstrate how Fuzzy Grouping can identify potential duplicates despite common misspellings, nicknames, and partial matches.
In conclusion, Fuzzy Grouping is an easy to use and powerful tool to assist in any data cleanup effort. It is simple to setup, and quickly evaluates large amounts of data. SSIS can provide you with all of the tools to make informed decisions regarding your customer data, your most valuable asset.
Over the holidays, Salesforce posted the Spring ’15 release notes detailing what they’re planning on releasing come mid-February. I’ve poured through them to pull out what I think are the most exciting for both our customers and us.
We talked briefly about this in our Winter ’15 preview post, and with this release it has both become Generally Available and includes several improvements. This feature brings improved duplicate detection and blocking to the core Salesforce platform, and contrary to our preview post this feature does not require an extra license (although it does use Data.com technology). Several key enhancements were made from the Beta release in Winter ’15 including:
- Support for custom objects
- Ability to define cross object rules for duplicates
- Support for picklist values
- APIs and Apex classes added to let developers manage duplicate detection programmatically
There are some limitations to the duplicate detection to be aware of, so as always be sure to read the release notes.
This feature is available in Professional, Enterprise, Performance, Unlimited, and Developer editions.
It would be difficult to create this list and justify leaving out Analytics Cloud. Arguably the biggest announcement to come out of Dreamforce this past year, Analytics Cloud is Salesforce’s take on how to do analytics and reporting in a user and mobile friendly way. It’s built on top of the Salesforce platform so there’s no need to host it yourself, but it does cost an additional fee.
This feature is available in Enterprise, Performance, and Unlimited editions.
This feature is actually a combination of 2 new product offerings from Salesforce: an exchange connector which can sync contacts and events to and from an exchange server and Salesforce, and the Salesforce Side Panel. The exchange connector is the beta portion here, giving administrators the ability to set up a connection between Salesforce and Exchange so that users not using Outlook can still have the records sync between the two. Since this is a server side process, no additional software is needed to be installed on the user’s machines.
This may seem like a silly feature at first, but any business that’s been around for more than a few years will probably have records owned by people who no longer work at the company. Until now, you needed to reassign those records to another user before you could update them. In some cases, especially in integration scenarios, we really just want to update the record no matter who the owner is. With this feature, we can finally do so.
This feature is available in all editions.
With this feature, any record which has a standard address field (Accounts, Contacts, etc) will now display a Google map image of the address if the fields are filled in. Note that Salesforce did send an opt-out notice, and that the feature can always be disabled via the settings menu.
And much more…
Of course, this only scratches the surface of all the improvements made by Salesforce in the upcoming release. If there’s something in particular you are wondering about that we didn’t cover here, feel free to read through the full release notes or contact us and we can help you find what you’re looking for.
Salesforce recently alerted administrators of organizations to an upcoming change to the certificates used in HTTPS. We think that security should always be taken seriously. That being said, it can be frustrating to stay on top of updates, especially if a change breaks your everyday flow. To ensure that as many people as possible see the notification, we’ve posted the body of the notification below.
What is changing?
To maintain alignment with security best practices and the industry-wide shift to use more complex algorithms for HTTPS certificates, Salesforce will be replacing current HTTPS certificates, which are signed with a SHA-1 hash algorithm, to new certificates signed with a SHA-256 hash algorithm. HTTPS certificates are reflected in the browser’s URL bar to indicate a secure connection while accessing secure websites, including Salesforce.
What action do I need to take?
In order for users to continue to have access to Salesforce, you need to ensure your operating systems (OSs), browsers and middleware are capable of accepting HTTPS certificates with SHA-256 hash algorithms.
We are asking all customers to be prepared for this change by:
- April 1, 2015 for Sandboxes
- August 1, 2015 for all Instances
We will begin changing HTTPS certificates in a phased approach shortly after these dates. Exact dates will be published in March 2015.
Is there a quick way to test if I am prepared for this change?
Yes. We have established this test page to quickly check if your OSs, browsers and middleware will accept HTTPS certificates with SHA-256 hash algorithms. We have provided instructions for how to use this test page in this Knowledge Article.
What will happen if my OSs, browsers, and middleware are not capable of accepting these new HTTPS certificates?
If your OSs, browsers, and middleware cannot validate the new HTTPS certificates, your users will not be able to access Salesforce.
Why are you not changing the HTTPS certificates sooner?
The HTTPS certificates that Salesforce uses today are secure. However, it is a best practice to continuously increase the complexity of security encryption protocols and tools. We designed the timeline to give customers time to prepare for this change while maintaining a secure environment.
What if we use middleware that requires us to upload the certificate into the middleware (i.e. locally cached)?
If your organization is running middleware that requires the certificates to be locally cached, you will need to update the cached certificates as a result of this change. To learn more about how this information will be communicated, please join the customer Success Community Collaboration group, Official: Certificate Changes.
Where can I get more information?
We have developed a Knowledge Article to provide additional information. Additionally, you can reach out to Customer Support by logging a case in the Help & Training portal.
Microsoft recently announced new features that have come out with their next version of Microsoft Dynamics CRM 2015 (previously code named Vega). Check out the Dynamics CRM 2015 Release Preview Guide to see what features came with 2015.
Next up for our review are the enhancements being made to Outlook and the Sync Process. One thing to note is that all the enhancements outlined in this blog apply to both the legacy Outlook Sync and new Server Side Sync process introduced with CRM 2013.
Below are the enhancements that are included with CRM 2015. We’ll go into a few of these enhancements in more detail later in this blog.
- Contact Phone Number and Address Sync Improvements
- Sync Outlook Assigned Task (Outlook task assigned to another user that is also in CRM). This is not enabled out of the box and a System Setting needs to be enabled to turn this on
- Sync Appointment Attachments. This is also controlled via a System Setting.
- Configurable Field Level Sync
- Outlook Client
Navigating to Settings –> Administration –> System Settings –> Synchronization will display the dialog of all the organization level settings regarding the Outlook sync process. See below.
In this dialog you have a mix of legacy pre-2015 settings, and a handful of new 2015 settings. The new configuration settings you have at your disposal are:
- Synchronized Fields: This is where an admin can modify what direction fields are synced. This is explained more below.
- Synchronize Appointment Attachments: With 2015, you can enable attachments on appointments to synchronize between Outlook and Dynamics CRM.
- Address Sync: This is explained more in the section below.
- Synchronize Assigned Tasks: An admin can enable if Outlook Tasks that are assigned to another user are tracked in CRM or not.
Contact Phone Number and Address Sync
With CRM 2015, Microsoft has changed the sync process for Contacts. 4 more phone numbers were added to the sync process for a total of 11:
- Assistant’s Phone
- Business Fax
- Business Phone
- Business Phone 2
- Callback Number
- Company Phone
- Home Phone
- Home Phone 2
- Mobile Phone
- Telephone 3
There’s also an organization level System Setting that allows you to indicate if you want to sync either A) just the Outlook Mailing Address, or B) all 3 Outlook Addresses (Business, Home, Other). This setting is available by going to Settings –> Administration –> System Settings (shown above).
Configurable Field Level Sync
One of the biggest questions we’re asked over and over with our clients is what fields are synchronized between Outlook and Dynamics CRM. There are a few sites out there that go into detail on what fields are synchronized, but nothing within the application provided by Microsoft. They also don’t easily indicate which Outlook fields synchronize to which CRM fields, the direction of the sync, and the ability to turn off that sync (in other words, all fields synchronized all the time).
Now with Dynamics CRM 2015, you can navigate to Settings –> Administration –> System Settings –> Synchronization –> Synchronized Fields. From this location, you can see the mapping between Outlook fields and CRM fields and the direction that the sync is currently configured for.
For each field you can modify the sync direction so that it syncs both ways, sync one way, or don’t sync at all. This is currently an Organization level setting that’s setup in the Settings area of CRM and one improvement that I can see here is making this a user setting so that each user can have individual unique sync experiences if for some reason they don’t want to share information about Contacts that are in their Outlook and also tracked within CRM. However, for the current release of 2015, individual users can at least view the sync directions that their administrator setup by navigating to their Personal Options –> Synchronization –> Synchronized Fields
There are a couple quick use cases that come to mind that I know most customers would be ecstatic to get their hands on:
- Private Notes: Turn off the sync process on the Outlook Notes field. Therefore users can add Notes within Outlook and they won’t flow to CRM for everyone to see. They can keep their own personal notes locally in Outlook.
- Read Only CRM Data: Set the sync direction on the desired read only fields to go from CRM to Outlook only, meaning updates in Outlook will not update CRM, and CRM will overwrite Outlook changes.
Another resource on this subject is an article that Microsoft recently published. While having this in the application is useful, this link also provides more details for administrators.
Outlook Client Enhancements
There have been changes to the Outlook Client itself in addition to the sync changes.
First off Microsoft has now added OAuth support to the Outlook Client. This enables multi-factor authorization to the Outlook client and brings consistency across CRM clients (web and Outlook).
Microsoft has also cut the clutter out of configuring the Outlook client. Users simply need to provide the Organization URL to get up and running as fast as possible. See below for what the configuration process looks in Dynamics 2013, and how much easier it is in 2015.
Also, in order to help troubleshooting issues between Client and Server, Dynamics CRM 2015 now automatically detects compatibility issues between the Client and Server. A notification is sent to the user if a compatibility issue is detected.
Finally, another troubleshooting addition made by Microsoft is when errors are detected, a “Resolve This Issue” dynamic help link will appear. This link will be dynamic and will search a server side database of articles that will route customers to the right resolution for their issue.
Upgrade Experience and Supportability
This topic isn’t really an enhancement, but goes into details on moving to the Dynamics CRM 2015 Outlook client, and what versions are supported.
In order to upgrade to the 2015 Outlook client, you must be on Outlook 2010 or higher (support for Office 2007 is being dropped). Microsoft is also dropping support for:
- IE 8, IE 9
- Windows Vista
- Windows Server 2008 Remote Desktop Services
- Windows Server 2008 R2 Remote Desktop Services
The Outlook Client must be in “Online Mode” for the upgrade to succeed, and Microsoft is allowing all 2013 Outlook Client versions to upgrade to the 2015 Outlook Client. Also, users will be able to continue to use the 2013 Outlook Client if they deploy the 2015 server. However, they’ll only be able to use it in “Online Mode” (i.e., no offline capabilities will be supported).
The recommended process for upgrading your Outlook Client is the following. This process will ensure users are able to continue to use their Outlook Clients during your server upgrade to Dynamics 2015.
- Upgrade all Outlook Clients to 2013
- Upgrade your server to 2015
- Upgrade all Outlook Clients to 2015
We hope you’ll find that these improvements will add more configurability and robust functionality to the Outlook Client. I can see some future improvements Microsoft may want to add in with the sync process (allowing administrators to add/remove/edit what Outlook fields sync to what CRM fields including the ability to sync to custom fields), but it’s good to see Microsoft is continuing to go down the path of putting more configurability options in the hands of administrators, and removing any hard coded logic.
Good luck with your 2015 upgrade, and with all upgrades, plan…test…plan…and test some more!!
In part one of this series, we looked at how and why you would create custom permissions, and in part two we looked at how a developer could use them when writing Visualforce. In today’s post, we’ll be looking at how developers can use custom permissions when writing Apex code to control access and functionality inside triggers, web services, and Visualforce controllers.
Under the hood, Salesforce stores custom permissions as Custom Permission records. When writing apex code, we need to query this table to determine what custom permissions exist, and then tie those records back to the user through the SetupEntityAccess and PermissionSetAssignment objects. To help visualize the hierarchy we need to traverse, we’ve created an ERD describing the relationship of the objects:
The important thing to understand here is that eventually every permission gets tracked through a PermissionSet record, even the permissions granted by profiles (API 25+). Using these objects, developers can write utility functions for determining what custom permissions a user or group of users have assigned to them, and act accordingly.
Confused about custom permissions? Not sure how to access them from your code? Need a partner to help you navigate the configuration sea? Contact us and we can help.
In part one of this series, we looked at how and why you would create custom permissions. Now that we have a custom permission created, we’re going to look at how a developer can use them when writing a Visualforce page to control the functionality of the page.
The $Permission global variable
Along with the release of custom permissions, Salesforce also released a new global merge variable for Visualforce called $Permission. The new merge variable contains boolean values indicating if the current user has a given custom permission.
Using our Manage VIP Status custom permission we built in part one, we can build a very simple Visualforce page which just prints out if the current user has the custom permission or not:
When the user does not have the custom permission assigned to them, the page displays:
However, when the custom permission is assigned to the user, the page displays:
As you can see, it is very easy for developers to leverage custom permissions when building Visualforce pages to control access and functionality at a more granular level.
In part 3 of this series, we will look at how developers can access custom permissions from Apex code to control access inside triggers, web services and Visualforce controllers.
Confused about the new merge variable? Not sure what merge variables are? Something else on your mind? Contact us and we can help.
Microsoft has been rolling out CRM 2015 for Online organizations (On-prem download can be found here) but before you perform the update you will want to review the new list of unsupported customizations in 2015 to see if you are currently using any of them.
Earlier in the year, in the 2013 SDK, Microsoft provided a list of things that will be changing in the next release which can also be found here in the MSDN. Only 3 functions are being removed, getServerUrl (use getClientUrl), isOutlookClient (use client.getClient) and isOutlookClientOnline (use client.getClientState). The Xrm.Page.ui.getFormType call will no longer return 5 for Quick Create and 11 for Read Optimized as those types of forms were removed/deprecated in earlier releases. Also be sure that your customizations are no longer using the old 2007 endpoint as it is removed in CRM 2015. To help detect if you are using the 2007 endpoint, you can run the Legacy Feature Check tool against your organizations.
Lastly, there have been some changes to the web application requirements for CRM 2015. Support for IE8 and IE9 has been removed with the new version. See below for a list of all the supported browsers:
- Internet Explorer 10
- Internet Explorer 11
- Mozilla Firefox (latest publicly released version) running on Windows 8.1 or Windows 8, or Windows 7
- Google Chrome (latest publicly released version) running on Windows 8.1 or Windows 8, or Windows 7, or Google Nexus 10 tablet
- Apple Safari (latest publicly released version) running on Mac OS X 10.8 (Mountain Lion), 10.9 (Mavericks), or Apple iPad
And the supported versions of Microsoft Office:
- Microsoft Office 365
- Microsoft Office 2010
- Microsoft Office 2013
As always be sure to perform the upgrade first in a development or sandbox org to verify that your customizations are still functioning post-upgrade before upgrading your production environment.
Today's post is written by Andrew Monshizadeh, an iOS Developer at Sonoma Partners.
As Salesforce.com consultants, we are often asked to provide fully customized solutions for our clients' needs. This can range from basic customization via the Setup interface (Point & Click Customization) to creating entirely new experiences on top of the Salesforce.com platform. Often though, we are found somewhere in the middle and need to create simpler Visualforce pages, and backing Apex controller/extensions, to simplify some processes for the client.
When developing Visualforce pages, there comes a point where it feels like sections are starting to be repeated. In development, there is a principle called "Don't Repeat Yourself" (DRY) that says if there is code being repeated, the developer needs to rewrite that code into a reusable component. The DRY'er the code, the easier it should be to maintain and understand. Thankfully, the Salesforce.com platform provides this functionality for Visualforce -- Visualforce Components.
Visualforce Components are little (or big) snippets of Visualforce that can be reused across numerous Visualforce pages, or multiple times in a single page. These components, then encapsulate whatever reusable visual and logical elements necessary to be self-containing. Additionally, a Visualforce Component can have a backing Apex controller class. With that backing controller, the component can do additional processing necessary for itself, without relying on the parent page's controller.
As an example of where this can be helpful, consider the situation where a client wants to display a table of Case records relating to a given Account. Normally, the developer would just put an <apex:relatedList> tag in there, and call it good.
Figure 1: What a standard related list would look like
However, what if the client wants some dynamically generated content in that table, like the most recent Case Comment inline with the Case Number? This is not so simple.
The most common solution would be to use an <apex:pageBlockTable> tag, pass in a list of Cases, and create a Map of Case ID to Case Comment Body in the page's Apex Controller. However, this potentially breaks the concept of DRY code if there is even another situation where the client wants to use this list of Cases and Case Comments because all of the logic and view is tied into this one Visualforce page. In order to reuse this Case list, the developer would have to copy/paste the Visualforce and Apex into another page and controller.
Figure 2: Custom page block table
A better solution would be to move the <apex:pageBlockTable> tag, along with the Case and Case Comment Apex code out into a Visualforce Component and backing Apex Controller. With a properly developed component, it is extremely simple to add this Case and Case Comment list to any page that needs to display this information.
In the second part of this post, we will discuss the process of building this example component.
Have questions about Visualforce Components? Let's set up a time to talk.
The Salesforce Admin's Toolbox is written by Megan Burch, a Salesforce Business Analyst at Sonoma Partners.
Salesforce is a powerful platform and it’s incredible to see what administrators can do without custom code or development. But what many Salesforce admins don’t realize is that they can solve many complex scenarios with a just a little bit of code and configuration, without the assistance of a developer.
The Salesforce Admin’s Toolbox is a series designed to showcase a variety of technical tasks that admins can do to elevate their Salesforce solution. I’m here to empower the admin and show you how to accomplish things you once believed could only be done by a developer.
Visual workflows allow admins to construct complex scenarios with forms and business processes. What becomes a little tricky, is providing users an easy way to access the flow within Salesforce. Users access these flows directly from a URL, through a custom web tab, or a custom button. Personally, I like using custom buttons to access the flow because the user can run it directly from the record they’re viewing. This approach may appear a bit intimidating because in addition to creating the custom button, you first have to embed the flow in a Visualforce page. But as you will see, this is really not as hard as it sounds if you follow these steps.
1. Create a new Visualforce Page
This can be done by navigating to Setup > Develop > Pages then clicking “New”
2. Embed your flow
Every new Visualforce page starts out looking like this
Remove the existing code.
For line 1, type the following:
<apex:page standardController="Contact" tabStyle="Contact" >›
The <apex:page /> tag is the command to create the page.
Note you’ll set the style of the page based on the object where you want the button to appear. In this case we’re going to put it on the Contact page. If you’re using this on another object, just substitute the name in line 1, if you’re using a custom object, append __c at the end for the standardController and tabStyle values.
The second line of your page will call the flow using a component. The component for calling a flow is simply <flow:interview /> with a name filled out.
On the second line, use the following:
Note: The name must be the unique name you created in Salesforce, so underscores will be used between words. If you’re not sure what the unique name of your flow is, navigate back to the flow you created and locate the unique name on the top right.
The last line will just be the closing page tag, so overall you’re page will look like this:
<apex:page standardController="Contact" tabStyle="Contact" >
We have just created a custom VisualForce page! Next we need to create the custom button that will access our new page.
3. Create a Custom Button
To create a custom button navigate to the “Button, Links, and Actions” option from the object you want to create the button. For your example, we will use the Contact object.
A “List Button” will show up on any related lists or list view you choose to put it on.
Again for this example, I chose Display in new window. I chose this behavior so the user could run the flow without losing visibility of the contact record they were on previously.Finally, you’ll want to select your content source, which in this case is Visualforce page.
4. Adding a Custom Button to a Page Layout
To add your custom button, navigate to the edit page layout screen. Select the “Buttons” option from the sidebar, and drag your button onto the page.
Salesforce comes with an extensive security model built in that can handle many different scenarios, from controlling access to data and functionality, to guiding data through different flows and business processes. However, no security model, no matter how extensive, can possibly cover every need of every business and still be useable. To account for this, Salesforce added custom permissions in Winter ‘15 to allow administrators and developers to extend the security model to meet their needs. In the following posts, we will be looking at use cases for custom permissions, as well as how to create them and use them.
A use case for custom permissions
Let’s assume we work at a company where Accounts can become “VIP” accounts. The rule is that there is one person at the company in charge of maintaining who the VIP accounts are. This person could potentially be anyone. Our company would like the ability to change who the VIP manager is as needed. How would we accomplish this?
One solution is to add a checkbox to the User record that tracks if the user is a VIP manager or not. This works, but there are a few draw backs. The first is that to maintain who is a VIP manager, you need to go in to each user record and update the bit field accordingly. For a large company that has many potential VIP managers, this can become time consuming and error prone. The second main problem is that this architecture isn’t semantic about what the bit field is actually doing. What this option really represents is the ability (read: permission) of the User to elevate and demote Accounts to VIP status.
With Winter ’15, we now have the ability to create and assign custom permissions. Once created, custom permissions can then be leveraged by developers while they’re writing code to enforce that certain functionality or behavior is only available to people with or without the permission.
The advantages of custom permissions are twofold. To start, they can be included in Permission Sets to bulk apply it to your users, as well as associated with profiles so that any user with the profile automatically gets the custom permission assigned to them. Secondly, they’re more semantic about what they’re doing. It’s clear that they’re granting someone access to do something instead of just providing data about the user.
Creating a custom permission
To create a custom permission, navigate to Setup > Develop > Custom Permissions and click the New button.
On the following screen, give the custom permission a Label and Name (the name is used by developers when referencing the permission in code). You can optionally give a description of the permission, and relate it to a Connected Application if applicable.
After clicking save, your new permission is created and available for use in code.
In part 2 of this series, we’ll look at how developers can use the custom permission when creating Visualforce pages to control how the page functions.
Curious about custom permissions? Not sure when to use them? Just need someone to talk to? Contact us and we can help.
Today's post is written by Andrew Monshizadeh, an iOS Developer at Sonoma Partners.
As a developer who primarily works on an Apple laptop, I recently upgraded to OS X Yosemite.
However, that brought with it a few problems - namely, my browser of choice (Chrome) updated to a version that broke compatibility with a few enterprise applications we use on a daily basis. To prevent having to switch between browsers constantly, I decided to move my entire workflow to Safari.
I quickly ran into a roadblock though — with the number of Salesforce orgs I use numbering into the double digits, I am unable to remember all of those logins. On Chrome I used the wonderful Force.com Logins. Safari, however, did not have anything like that. Therefore, I decided to build it.
Overall this was a great experience learning the advantages, limitations, and potential for building Safari Extensions. If you would like to view the code, help make it better, or just use the extension, please head over to our github page and check it out!
Today I am co-blogging with Blake Scarlavai, Development Principal and Microsoft Dynamics blogger at Sonoma Partners.
Recently a vulnerability in SSL 3.0 known as “Poodle” gained some significant attention, with many companies responding in various ways to ensure their customers’ data is protected. It can be confusing to keep track of what companies are doing what, and what is expected of you as a customer to ensure you are not vulnerable. Below are the summaries of the responses that Salesforce and Microsoft have taken.
Salesforce is in the process of disabling SSL 3.0 on their platform. By the end of December, you will no longer be able to use SSL 3.0 visit Salesforce’s platform. For the most part, we don’t expect this to affect our clients as the browsers which needed SSL 3.0 still enabled (IE 6 mainly) are already not supported by Salesforce. You can get the full list of the disable schedule and more information about the changes on Salesforce’s help page.
Microsoft is in the process of remediating their online services for the SSL 3.0 vulnerability. Below is a time table for each of the CRM services:
SSL v3.0 Mitigation Status
Microsoft Dynamics CRM Online
Microsoft Dynamics Marketing
Microsoft Social Listening
Parature for Microsoft Dynamics
Microsoft Dynamics Lifecycle Services
Online Services for Microsoft Dynamics
Microsoft also recommends disabling SSL 3.0 in your browser. The following resources can be used for your respective browser:
- Internet Explorer: https://technet.microsoft.com/en-us/library/security/3009008.aspx
- Firefox: https://blog.mozilla.org/security/2014/10/14/the-poodle-attack-and-the-end-of-ssl-3-0/
- Chrome: http://dottech.org/166990/how-to-disable-ssl-3-0-support-in-chrome-tip/
For more information on Microsoft’s response, click here.
Curious to find out what is new in CRM 2015? Head here to the Customer Center to see a list of new features in 2015. In preparation for the release, we have also been covering the new features in detail:
- Sales Module Enhancements
- SLA Enhancements
- Tablet Client (MoCA) Enhancements
- Hierarchical Security
- Calculated and Rollup Fields
- Enhanced Business Processes
- Hierarchy Visualizations
- Social Insights & On Prem
- Enhanced Business Rules
- Multi Entity Search
Hit us up in the comments and let us know what you think of CRM 2015 as well as any topic you would like covered further!
Microsoft recently announced new features coming out with their next version of Microsoft Dynamics CRM 2015 (previously code named Vega). Check out the Dynamics CRM 2015 Release Preview Guide to see what features are coming with 2015.
Next up for our review are the changes being made to the Sales Module. The following list of enhancements are being made with CRM 2015 and we’ll dive into a few of them a little bit deeper:
- Product Bundles
- Cross Sell / Up Sell (via relationships between products)
- Product Families
- Territory Specific Default Price List
- Import/Export Settings via the Configuration Migration Tool provided with Leo
- Families/Products/Bundles all show up in one grid
- Clone Families/Products/Bundles (field values and all current product property values – including overridden values).
- Product Form Preview (displays the product properties so you can preview how it’d look when selling the products)
- New System Settings Configuration Options
- Override default pricing engine via code/SDK
Now lets dive a bit deeper into some of these features.
If you’ve used Product Kits in the past, you’ll be familiar with Product Bundles. Bundles are an enhanced version of Product Kits (e.g., you cannot view Kit Items when selling a Kit, but you can with a Bundle – see the Opportunity screenshot below). Product Kits will not be going away with CRM 2015, but instead Bundles will be an additional option users can use along with Kits.
Within a Bundle you can specify what Products are mandatory or not when selling the Bundle. They can also be tied to Product Families (more information below) but are not required to be. Finally, Products within Bundles have Properties that can be edited (e.g., what is the default value, is the property editable when being sold, etc.).
When adding the Bundle to an Opportunity, Quote, or Order, you’ll see the Bundle with the individual Products indented underneath. You‘ll also have the availability to edit the properties of the Products in that bundle for the specific Opportunity, Quote, or Order you’re working with.
Cross Sell and Up Sell
As stated above, using a relationship between Products, you can define Cross Sell and Up Sell products. This Product Relationships area is a sub-grid directly on the Product form.
When on an Opportunity, Quote or Order selling products, there will be a Suggestions Link that when clicked, will show the Cross Sell and Up Sell products that an administrator has defined for your organization. The user can click on Pick and then Add to List to add the suggested product to their opportunity immediately.
Product Families are another way to group products and create product hierarchies. The Child Products in a Product Family inherit the properties of the Product Family when they’re added to the Product Family, but can be overridden. Then, when adding the Product to an Opportunity, some of these properties can be modified by the Sales Person, while others may not be (defined in the Settings of the Product Family setup). The properties can be Read Only, Required, or Hidden.
Product Families are similar to Bundles, but the user cannot add a Product Family to an Opportunity, Quote, or Order like they can with Bundles. Instead, Product Families are used for administration of Products themselves.
New System Settings Configuration Options:
There are a handful of new System Setting Configuration Options coming with CRM 2015 that should be called out separately. The following settings can be configured per CRM organization:
- Indicate if the Default Price List is set via an inbuilt rule. If this is set to yes, then the default price list will be selected for an opportunity based on the default price lists defined for territories.
- Max # of Products in a Bundle
- Use system pricing calculation (override default pricing) – customers can use the SDK to have a custom pricing engine built in
- Discount calculation method: Per Unit (new option) or Line Item (previous option)
- Max # of Properties for a Product/Bundle
Some great new additions are being added to 2015 as you can see from above. However, with these new enhancements, there are still a few limitations you should be aware of:
- You cannot have bundles of bundles (only products are allowed to be added to bundles)
- Only active / retired products can be imported/exported via the configuration migration tool
In Part 1 of this post, we looked at Remote Objects from a high level, examining what Remote Objects are and the reasons for using it. In this post, we’ll look at how to actually use Remote Objects on a page as well as some samples of the basic CRUD operations that can be performed.
Enabled Remote Objects on the page
Remote Objects is very easy to start using. If your organization has been upgraded to Winter ’15 (API 32), you already have Remote Objects. To start using them on your custom Visualforce pages, you will need to use a set of 3 new tags: apex:remoteObjects, apex:remoteObjectModel, and apex:remoteObjectField.
For example, assume I want access to the Account object and that the Account object has a custom field named Custom__c on it. I want to be able to access the Id, Name, and Custom__c fields, and additionally rename the Custom__c field to just Custom so I don’t have to keep typing the __c. I could use the following code to accomplish this:
If you do not have any fields you want to rename, there is a short hand for specifying the fields you want:
Accessing the generated proxies
One important thing to note is the jsNamespace attribute on the remoteObjects tag, which controls the namespace of the generate JS objects. In our case, I set the jsNamespace = JSObjects, so when creating a new proxy instance I need to use that namespace. If you do not set the attribute, the default is SObjectModel.
To create objects, we can use code like:
Deleting objects is very similar in form:
The query object has to follow a specific format for the retrieve operation to work. You can find out more details about it on the documentation page. One thing to note here is that it appears you cannot traverse relationships in these queries like you can in SOQL.
For example I wanted to write the equivalent of:
Unfortunately, you cannot write this kind of where clause. If you do, you’ll get an error back from Salesforce about the query not being in the format you expect. This is mildly disappointing since it’s going to force developers to write more queries, which means pages will have more callbacks (reducing readability) and be chattier over the network.
If you want to just see a full page example of Remote Objects, check out this demo page which we’ve hosted on Github. If you find any mistakes or would like to expand on the demo, feel free to fork the repo and send us a pull request with your changes.
Your sales team’s expectations are changing with evolving mobile technologies.
Take a quick look at the role that mobile devices play in their personal lives and take notes. We’d bet that a majority of your team uses their phone to complete tasks that increase productivity and save them time. It’s never been easier to pay bills, book flights, and set that painful reminder for a dentist appointment with just a few swipes, taps, and submits. Field teams are demanding new ways to be productive on the road and if your CRM solution doesn’t meet, or better yet exceed, these expectations… you won’t get the adoption you’re expecting.
Mobile CRM applications can help you drive user engagement and user adoption like never before. Take advantage of the unique opportunity that these tools present, and build your team an app that gives them access to the information they need, when they need it, in a way they want to receive it.
Mobile CRM and User Engagement
Building a mobile CRM application for your organization gives you the opportunity to capitalize on internal excitement that can come with a new launch. Imagine two very different, but very real, scenarios for rolling out your future CRM system.
You are in a conference room that is filled to the brim with your sales team who are uncomfortably itching in their seats. They’ve noticed that there are 50 slides in your onboarding PowerPoint presentation and everyone looks to their lap where they try to inconspicuously reply to emails, on their phone. If you’re lucky, you have 50% of the room’s attention. You’ve spent months building your CRM and the group’s response is lackluster at best. From the point of unveiling, you’ll have to deliver solely on productivity and user value (you did focus on those during your design and implementation, right?) in order to achieve a successful adoption.
You are in a conference room that is filled to the brim with your sales team who are relieved to hear there won’t be an onboarding PowerPoint presentation. You begin the unveiling of your CRM by distributing an iPad Air to each member of your team with CRM/business applications that will help them close more business.
If you hand your end users a tablet, preconfigured with the tools they need, they are far more likely to take you seriously. Who wouldn’t love a shiny new toy that could help them do their job more efficiently?
The device handoff approach is far more effective than sending out an email announcement with a link to your CRM log-in. Trust us, we’ve seen both scenarios unfold and there’s no surprise as to which inspires greater end user excitement and engagement.
Mobile CRM and User Adoption
But the excitement that comes with a new CRM system and the corresponding device will eventually wear off. How can you use your mobile app to keep users engaged to the point that they consistently use the system?
Build or enable tools that truly serves their needs. Building value should be at the core of your project and without it, your users will stop using your app before eventually deleting it.
One way to make sure this doesn’t happen is to invest in customization.
A custom application will help you build an app for your user, not your data. Mobile CRM applications cannot do everything a web version can and it doesn’t need to. The goal is not to rewrite your existing CRM for mobility, but rather distinguish a new hierarchy of activities that your team needs access to on their phone or tablet.
Take the time to pinpoint the 2-3 key things that your mobile CRM application needs to be able to tackle. Minimize the complexity of your mobile CRM application by focusing on the key tasks your end users need to do on the day-to-day. If you can build your team an app that continues to solve their problems in a more efficient way, you create the best possible opportunity for user adoption.
One more thing. Choosing the right device is an important decision you need to make to maximize the value of your mobile CRM application. Outline the tasks your users need to perform and then align these tasks with the native components of different devices. Matching the device capabilities with your users needs will help you build the most effective product.
Want to learn more about Mobile CRM applications, user engagement, and user adoption? Contact us to see how you can create meaningful experiences for your users, which can positively impact the adoption and effectiveness of your CRM.
Time is the one thing we all have an equal amount of, yet most would agree that sometimes, 24 hours is just not enough. And a lack of time, or misuse of it, could be what’s keeping your sales team from thriving.
“We want it when we want it.”
Sound familiar? We're making purchase decisions faster than ever before. Our access to information coupled with our ability to click, tap, and swipe our way to a final sale has turned us into lean, mean, purchasing machines. And many transactions that once warranted the need for a sales person now only require a mouse. Depending on which report you’re looking at, studies show that customers are around 60 percent through the sales process before engaging a sales rep.
Once your potential customers do make contact, more educated about your product and arguably more eager to make a purchase than ever, is your sales team responding quickly enough to seal the deal?
It’s estimated that sales representatives spend just 35% of their time selling, with the rest of their week dedicated to:
Preparing for meetings and researching prospects
Creating their own sales collateral
Searching for relevant documents
If your sales force isn’t reacting to customer contact at lightning speeds, your prospects will move on to a vendor that will. What can you do to recover this lost time and get your sales team focused on serving your prospects at the speed that they expect? CRM.
1. Use CRM to Accelerate Responsiveness
Time is a commodity. If your sales team can help prospects make faster purchase decisions, you’re immediately providing them with real value. But faster sales require faster follow ups and faster responses. How can you use CRM to accelerate responsiveness?
Generate automatic reports and emails that notify designated sales rep each time a lead converts
Detail all interactions with prospects so your sales team can access the information it needs about a specific contact at a moment’s notice
Every moment you aren’t responding to a new lead or answering an inquiry from a current customer is a moment lost. The longer a customer has to wait on you, the more time they have to research an alternative solution.
2. Use CRM as a Document Repository
An overwhelming majority of sales reps don’t use marketing deliverables. This painful reality is flawed for several reasons. The obvious? Your sales team is spending their time creating collateral instead of selling. But this is also problematic for your marketing team and your organization’s brand image. Disjointed messaging, a lack of visual consistency, and lackluster sales materials all work against you as you’re trying to close.
Build your CRM to include all relevant sales kits that your team needs. Set the expectation that these materials are the only ones to be used during the sales process and make sure your marketing team is working to keep them up to date and fresh. Design your documents in a way that make your sales team want to use them instead of the PowerPoint presentations they’re hiding on their laptops.
3. Use CRM to Document Sales Processes
Your sales process needs to clearly define how your sales team will engage with prospects. It can’t be aspirational and it must be well-documented so it can be accurately followed. How can you aim without a target?
Use your CRM to document:
How leads are handled as they convert - who is notified of new leads? Who is responsible for responding?
The mapping of your sales process and what steps are taken as prospects turn into leads, contacts, and opportunities
The duration of each step - how long does it take for a follow-up? Who is responsible for handling follow-ups?
Time is as much your enemy as it is your secret weapon. We all have access to it but we all don’t use it in the same way. If you are looking to increase the speed at which you communicate with your prospects and clients, look to CRM. A well implemented CRM can give your sales team what they need and want most: time.
With the release of Winter ’15, several new features were added that we at Sonoma think are useful and/or important. Today we will be walking through one of the feature in depth: Remote Objects.
Remote Objects is a new way for developers to establish a connection to Salesforce on custom pages they write so that they pages can interact with data stored in Salesforce. It leverages modern techniques allowing for a better mobile experience, while still retaining (most of) the power of the more established technologies. While this release is mainly targeted at developers, end users will reap the benefits in better performing and more stable pages, especially on mobile devices.
Before there was Remote Objects
Visualforce provides lots of features out of the box and is fast to develop with, but is was never designed for the mobile landscape we’re seeing grow in the enterprise world. (See this post on Lightning for a slightly more in depth explanation of Visualforce and why it doesn’t scale well on mobile devices).
In part 2 of this post, we’ll look at how to get started with Remote Objects, as well as some examples of how to use Remote Objects.
Have questions? Not sure if you have Remote Objects in your organization? Contact us and we can help.