With Salesforce.com’s recent announcement that they will “donate free licenses for our technology to organizations headquartered in Haiti (for the next 10 years)”, I’m sure the guys over at the Salesforce.com Foundation are busier than ever. If you are interested in donating your time to a nonprofit, contact the Salesforce.com Foundation and see how you can help.
The Saleforce.com Foundation has developed a great set of open-source Salesforce.com customizations to support some common nonprofit business processes called the Nonprofit Starter Pack (NPSP). If you are a nonprofit looking to implement Salesforce.com or a developer looking to help out, you should seriously look into the NPSP.
I’ve implemented the NPSP at small nonprofits (10 employees) as well as large ones (3000+ employees) and it’s use cases are applicable to virtually all of them. Steve Andersen, the Solutions Architect responsible for the NPSP, has done a great job updating, enhancing and supporting the NPSP. The installation process is well documented and smooth and the packages are feature rich, flexible and robust. I’ve had the pleasure of meeting and interacting with Steve and he’s a great advocate for the Foundation and nonprofits in general. Steve and the Foundation have groomed a great culture of help and support within the Salesforce.com community. I’ve posted questions a number of times to the NPSP discussion group and received answers from Steve and other members within hours.
The NPSP is broken into the following packages (with my comments):
Nonprofit Starter Pack Contacts And Organizations – This is probably the most important package to install. It solves a major problem when dealing with individuals within Salesforce.com. With this package you can easily treat individuals as accounts to hook into existing Salesforce functionality.
Nonprofit Starter Pack Households – This is another custom object that allows you to group contacts into Households. We didn’t use this package at the last implementation that I worked on but it’s essential if you want to create mailings that limit the amount of correspondence to a single address.
Nonprofit Starter Pack Recurring Donations – This package is pretty slick for creating recurring donations, a common theme with pledges. For example, you may have an individual that has pledged to donate $1000 per month. When you create the donation, the NPSP will create a series of Opportunities providing pipeline forecasting.
Nonprofit Starter Pack Relationships – This package allows you to connects two contacts together in a relationship. With nonprofits, it’s not what you know but who you know. This package allows you to track who knows who and then leverage those relationships.
Nonprofit Starter Pack Affiliations – Another great package to track associations. However, in this case it tracks relationship of people to organizations (accounts). You can track when a person worked for a specific company or when they were a board member for a specific foundation. It also tracks dates so you can see their current status of affiliation.
Steve has put together a large number of “how to” videos for the NPSP. I used them for general help but also showed them directly to the customer to see if each package met their needs. These videos are great time-saver.
Installation – One thing that really perplexed me was installation. Initially I could not find out how to install each package. Each package has it’s own installation link and instructions. Click on one of the package links above and scroll down to the bottom of the page to find the installation link:
In Winter ‘10, Salesforce.com introduced Custom Settings which allow you to store custom data sets and associate them on an org-wide, profile or user basis. Custom settings are essentially custom objects that are exposed in the applications cache and are accessible via their own API. Using custom settings is much easier than rolling your own solution as they are much faster and easier to access (cached at the application level and accessible via their own interface) and do not count against SOQL limits.
Hierarchy settings allow you to personalize your application for different profiles and/or users. The interface has baked-in logic that drills down into the org, profile, and user level (based upon the current user) and returns the most specific or lowest value in the hierarchy. I’ve found hierarchy custom settings to be extremely useful for those “one off” occasions. Let’s suppose you want to authorize your sales teams to be able to offer a specific discount to customers. You might set up an org-wide custom setting of a 1% discount that everyone is authorized to offer. Now of course you have a set of high-producing sales people that are in their own profile and are able to offer a 5% discount. However (and here is the “one off”), there is that one sales person in that same profile that has lobbied the VP of Sales to be able to offer a 15% discount. With hierarchy custom settings you can accommodate all of these scenarios!!
As with list custom settings, when you create a new hierarchy custom setting, the platform creates a custom object in the background for you (notice the API Name field). You then add additional fields to the custom setting in the same manner that you do for custom objects (you are limited to checkbox, currency, date, date/time, email, number, percent, phone, text, text area and URL fields). I found the management interface for custom settings a little confusing at first and got lost a number of times trying to add fields and/or data.
After you’ve set up your custom settings and added your fields, you can select the Manage link on the custom settings page to add add/edit/delete values for the entire org, a specific profile or individual users. The image below shows the 1% discount for the entire org and then specific settings for the Standard Employees profile and a specific user.
Selecting the View link for the profile displays the settings that apply to users that are part of the “Standard Employees” profile.
Selecting the View link for the “one off” user, displays the settings that are applicable for that user only.
Accessing Custom Settings Programmatically
The cool thing is now you can programmatically access these custom settings based upon the running user and return their most appropriate value (org-wide, profile or user) in formula fields, validation rules, Apex and the Force.com Web Services API with the following interface. Be sure to check out the custom settings docs for more detailed usage.
You can only access hierarchy custom settings in formula field and validation rules. Here is the generic syntax:
I received a number of emails regarding my last post, GWT UiBinder Hello World Tutorial, specifically how to pass values into widgets using the new GWT 2.0 UiBinder. Here’s a small tutorial on one of the ways in which you could do that. I plan on another tutorial on passing multiple objects using the @UiFactory method.
So here is the Entry Point class. When the module loads, it creates a new MyPanel object, passes the text “Random Text” to the constructor and then adds the panel to the RootPanel.
The MyPanel owner class defines a new constructor that accepts the passed string value (i.e. “Random Text”) and sets the value of hidden field called myField in the UiBinder template to this text.
When the UiBinder template runs, its owner class loads the value (“Random Text”) into the Hidden field which then passes this same value into the SomeWidget widget.
MyPanel.ui.xml
1
2
3
4
5
6
7
8
9
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"><ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:c="urn:import:com.jeffdouglas.client"><g:HTMLPanel><g:Hidden ui:field="myField"/><c:SomeWidget myField="{myField.getValue}"/></g:HTMLPanel></ui:UiBinder>
The SomeWidget owner class is fairly straight forward. There is a setter method for MyField which runs after the constructor, receives the text (“Random Text”) and writes it to the displayText field in the UiBinder template.
I just finished the Programming Assignment and wanted to provide some input for anyone taking it in the future. Without giving away the assignment here are my thoughts:
Allow plenty of time – The instructions suggest you allocate 20+ hours to complete the assignment. I think this is somewhat low as it took me roughly 30 hours to develop, test and deploy. Start early and knock it out before the the exam deadline. I got wrapped up on a project and, of course, finished it in the night before. I tend to work better under pressure.
Read the requirements thoroughly and often – The requirements are narrative in form; something you would expect to receive from a customer. I went through the requirements and created my own design doc which outlined objects, sharing model, triggers, controllers, Visualforce pages, workflow, security, etc. This is the document that I worked from.
Build in Production and code in Sandbox – I did virtually everything in Production which limited the amount of time needed to deploy. I built everything that I could in Production and then once I felt the solution was solid, I refreshed a Sandbox and cranked out the Triggers, Controllers, utility classes and Visualforce pages. Essentially declarative work was done in Production while code development was, of course, done in the Sandbox.
Test, deploy and retest – The test cases took some time but I wanted really strong test coverage. I think I only had one class with less than 100% coverage. After deploying all of my code to Production, I loaded some test data and went through all of the use cases to make sure it functioned as expected.
The essay portion at the testing center was fairly straight forward and took about 30 minutes. It was 6 questions as to how, why and for what reasons did I design the application the way I did.
I finished up an offline Case management POC a couple of weeks ago using the new Adobe Flash Builder for Force.com and was really impressed with it features and functionality given that it is still pre-beta. I’ve built a number of Flex apps for Salesforce.com but the new Stratus framework makes it a breeze with the new Salesforce.com-aware components. You can drag and drop a new LabelAndField component onto your application, wire it to a particular sObject field and it generates the functionality specified by Salesforce.com. So if your field is a picklist it automatically displays a populated combobox and configured default value, a boolean displays a checkbox, a text field displays a text box and so on. The really slick feature is if your field is a lookup to another object, it allows you to either type a value or click the magnifying glass button to search for values from the related object. The framework syncs the values for the related object to the SQLite database for you automatically! No worries. Another huge productivity gain is field validation. The framework generates the same validation you would see in the native Salesforce.com UI. This is a huge time-saver as validation rules typically change often during the lifecycle of a project.
James Ward, the Technical Evangelist at Adobe that works with Salesorce.com, introduced me to Markus Spohn who is the product manager for the Stratus framework at Salesforce.com. I sent both of them my feedback on the product and they were very responsive and eager for input. I have to give Salesforce.com credit as they really listen to customers. My only real concern was related to Flash 4 directly. I am by no means a Flash developer but I can produce Flex application by sheer will of force and brute determination. There are A LOT of really great new components in Flash 4 that will require a substantial investment of time to become proficient. James replied that Adobe is aware of the learning curve for Flash 4 and is working on ways to make the transition as painless as possible.
Markus demoed my POC at the Silicon Valley Flex User Group last week to a couple hundred developers and he said it was well received. These guys are much smarter than I am and I’m sure it gave them a new perspective on Salesforce.com. There are a lot of great possibilities for cross platform applications that can be built when you have access to Salesforce.com, the local file system and an on-board database.
We had our first annual company retreat at the Boulder Resort in Phoenix AZ this week as a chance to recharge and focus on our goals for 2010. Since 75% of the company works virtually, it’s nice to get together with 150 of your closest friends. There as quite a bit of eating, drinking, laughing and even some friendly public embarrassment of senior management. There were life-sized posters created, very “revealing” post cards delivered to everyone’s room and even an old karaoke video of one of the founders (Narinder) that popped up. The meeting is still underway today with sales and senior management and they are working hard. On the way out I heard reference to a management dodgeball game scheduled to settle some internal disputes.
Update: The photographer just posted some photos on her blog that are really cool! I like her comment at the bottom of the page, so check that out as well.
Even though the event was about having fun and reinforcing our great team culture, we did manage to get some work done. We outlined our goals for 2010, set some new strategies in motion and even unveiled some incredibly awesome new “stuff” that we will be rolling out this year (the first rule of Fight Club is….?). One of our main topics was how do we keep our hardworking-funloving-cuttingedgetechnologydriven-smacktalking culture intact while essentially doubling the company each year. It’s nice to see that management
One thing that we are very proud of is that we rolled out our new community involvement program that encourages and rewards employees for becoming involved in their community. We even kicked off the program with a team building event with an entire afternoon spent at the McDowell Sonoran Conservancy (yes, the desert) where we raked dirt, planted hundreds of cactus, moved rocks from point A to point B and generally made the desert a more presentable place. I think we actually outworked their expectations as we ran out of stuff plant, move and cleanse. I’m not sure how that happened.
Appirio is a fantastic place to work and we are always hiring smart, hard-working people that love drinking the cloud computing koolaid. If you are interested, drop me a line or check out the link above.
I’ve been working on a new project the past couple of weeks that (fortunately) requires Google Web Toolkit (GWT) and I wanted to use the new UiBinder that was released with GWT 2.0 in early December for a number of reasons (clean separation of UI and code, easier collaboration with designers, easier testing, etc ). However, I was having a hard time getting my head wrapped around it given that the GWT site has very little documentation and only a few examples. I’ve combed through the message boards, the docs and the sample Mail application that comes with the SDK and after finally groking the new functionality, I put together a little Hello World app, the kind that would have helped me out originally.
So I’m making some assumptions that you already have the GWT SDK and Eclipse Plugin installed and are familiar with both of them. If you are not, take a look at the GWT site for more info.
To get started, create a new Web Application Project called “HelloUiBinder” in the package of your choice but do not check “Use Google App Engine”.
Now create a new UiBinder template and owner class (File -> New -> UiBinder). Choose the client package for the project and then name it MyBinderWidget. Leave all of the other defaults. When you click Finish the plugin will create a new UiBinder template and owner class.
Open the MyBinderWidget.ui.xml template and add the following code. With GWT you can define your styles either in your template where you need them or externally. I’ve added a small style inline that adds some pizzaz to the label. Notice the field name myPanelContent in the template. You can programmatically read and write to this field from the template’s owner class. So when the owner class runs, it construct a new VerticalPanel, does something with it (probably add some type of content) and then fill this field with it.
Attributes for the elements (the text attribute in the Label element for example) correspond to a setter method for the widget. Unfortunately there is no code completion to get a list of these attributes in Eclipse when you hit the space bar so you either have to know the setters or refer to the JavaDocs each time. A painful process.
1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"><ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"><ui:style>
.bolder{ font-weight:bold;}</ui:style><g:HTMLPanel><g:Label styleName="{style.bolder}" text="This is my label in bold!"/><g:VerticalPanel ui:field="myPanelContent" spacing="5"/></g:HTMLPanel></ui:UiBinder>
For the owner class, MyBinderWidget.java, add the following code. In this class, a field with the same name, myPanelContent, is marked with the @UiField annotation. When uiBinder.createAndBindUi(this) is run, the content is created for the VerticalPanel and the template field is filled with the new instance.
Now open HelloUiBinder.html and remove all of the HTML content between the </noscript> and and </body> save it. Once you run the application, copy the development URL and run paste it into your favorite supported browser, you should see the following.
Now suppose you wanted to nest a widget inside your MyBinderWidget that did something when a button was clicked. We’ll create a small series of checkboxes that allows the user to select their favorite colors and display them when the button is clicked. Create a new UiBinder called FavoriteColorWidget in the client package. Add the following code to the FavoriteColorWidget.ui.xml template.
packagecom.jeffdouglas.client;importjava.util.ArrayList;importcom.google.gwt.core.client.GWT;importcom.google.gwt.event.dom.client.ClickEvent;importcom.google.gwt.event.dom.client.ClickHandler;importcom.google.gwt.uibinder.client.UiBinder;importcom.google.gwt.uibinder.client.UiField;importcom.google.gwt.user.client.Window;importcom.google.gwt.user.client.ui.Button;importcom.google.gwt.user.client.ui.Label;importcom.google.gwt.user.client.ui.CheckBox;importcom.google.gwt.user.client.ui.Composite;importcom.google.gwt.user.client.ui.Widget;publicclass FavoriteColorWidget extendsComposite{privatestatic FavoriteColorWidgetUiBinder uiBinder = GWT
.create(FavoriteColorWidgetUiBinder.class);interface FavoriteColorWidgetUiBinder extends
UiBinder<Widget, FavoriteColorWidget>{}
@UiField Label greeting;
@UiField CheckBox red;
@UiField CheckBox white;
@UiField CheckBox blue;
@UiField Button button;public FavoriteColorWidget(){
initWidget(uiBinder.createAndBindUi(this));// add a greeting
greeting.setText("Hello Jeff!!");final ArrayList<CheckBox> checkboxes =new ArrayList<CheckBox>();
checkboxes.add(red);
checkboxes.add(white);
checkboxes.add(blue);// add a button handler to show the color when clicked
button.addClickHandler(new ClickHandler(){publicvoid onClick(ClickEvent event){String t ="";for(CheckBox box : checkboxes){// if the box was checkedif(box.getValue()){
t += box.getFormValue()+", ";}}Window.alert("Your favorite color/colors are: "+ t);}});}}
The last thing we’ll need to do is add our new widget to the MyBinderWidget template. Open MyBinderWidget.ui.xml and add the custom namespace reference and the FavoriteColorWidget.
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">;<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:c="urn:import:com.jeffdouglas.client"><ui:style>
.bolder{ font-weight:bold;}</ui:style><g:HTMLPanel><g:Label styleName="{style.bolder}" text="This is my label in bold!"/><g:VerticalPanel ui:field="myPanelContent" spacing="5"/><c:FavoriteColorWidget/></g:HTMLPanel></ui:UiBinder>
Now when you run the application it should look like the following.
I recently received the Force.com Advanced Developer programming assignment and a few people have emailed me about its contents. So, not to give anything away, you essentially get a sandbox and an EE org to develop the app outlined in programming assignment. The requirements (8 pages) look pretty straight forward and nothing jumps out at me as being crazy. If you have experience developing Salesforce apps (and you should if you are taking this test!) it should look familiar. You deal with objects, roles, permissions, sharing model, workflow, Apex, Visualforce, etc. All of the things you would expect as an advanced developer.
You should budget a minimum of 20 hours to complete the assignment; however, they recommended that you budget as much time as possible to ensure there is ample time to successfully complete the assignment. Collaboration between candidates, use of Salesforce.com support, and solicitation of help from others is NOT allowed and is grounds for disqualification.
Both the programming assignment and essay exam need be completed and submitted by Monday, February 8th 2010 at 9:00 AM (GMT -8:00) Pacific Time (US and Canada). The essay exam and programming assignment will be evaluated and scored by a panel of salesforce.com experts and candidates will receive their pass/fail status approximately one month after the window closes.
For those that don’t have time to weed through all 171 pages of the Spring ‘10 Release Notes, I’ve pulled out a few of my favorites for your viewing pleasure. I didn’t hit all of the items in the release notes so make sure you pull up the the PDF and check out the goodies in detail.
Entitlement Management – Service Cloud By far the most detailed new feature at 45 pages! You can now set up entitlement management so that your support reps can verify if your customers are eligible for support, create and maintain service contracts, specify service levels on a per customer basis and enforcement of service levels with time-dependent, automated processes. There is a TON of stuff around Entitlement Management including service contracts and milestones so definitely take a closer look!
Quotes – Sales Cloud A quote is a record showing proposed prices for products and services created from an opportunity and its products. You can create a set of quotes to show different combinations of products, discounts, and quantities so customers can compare prices. Each opportunity can have multiple associated quotes, and any one of them can be synced with the opportunity. You can also create and email PDF quotes.
Answers – Service Cloud Answers is the newest feature of the Community application that lets community members ask questions, post replies, and vote whether they like or dislike a reply. It looks somewhat similar to Ideas in such that you assign categories to communities and then enable Answers for the customer and partner portals.
Knowledge Enhancements – Service Cloud A ton on Knowledge enhancements including new API objects for articles, metadata components for data category groups, describe calls for data categories, SOQL and SOSL filter, field level security for articles, custom report types and access to articles in the partner portal.
SOQL Enhancements
New GROUP BY Clause SELECT LeadSource, COUNT(Name) FROM Lead GROUP BY LeadSource
New HAVING Clause SELECT Name, Count(Id) FROM Account GROUP BY Name HAVING Count(Id) > 1
Aggregate Functions (Finally!!!!) SOQL now supports AVG(), COUNT(), COUNT_DISTINCT(), MIN(), MAX(), and SUM()
Date Functions A slew of new date functions for SOQL to make your life easier.
Semi-Join and Anti-Join Support For Reference Fields I ran into the issue all the time when writing queries. Now your subqueries can filter by ID (primary key) or reference (foreign key).
Force.com Apex Code Enhancements
The Apex scheduler is now generally available.
Callouts Enhancements including increased size limit, output messages with multiple elements (hurrah!!), new baked-in DOM class for parsing and generating XML content and enhanced two-way SSL authentication
Limits on the number of items a collection can hold have been removed. However, there’s still a general limit on heap size. What!!??
sObjects are now created as Objects and you can create generic sObject collections: Set foo = new Set();
I’m don’t this this is what Taggert was talking about during his DF09 presentation, but there are a lot of new logging features to check out on line 121. Check it out! Should make life easier until what Taggert revealed in on the roadmap for debugging is GA.
Visualforce Enhancements
component now uses Ext 3.0
Salesforce.com Stylesheets No Longer Called for PDFs
Force.com Web Services API Enhancements
New SOSL Clause for Filtering By Data Categories
New Support for API Version in Outbound Messages
Numerous new Objects to support Entitlement Management, Answers and Quotes
There are also some new and changed API calls
Support for Sites objects (Site and SiteHistory)
Force.com IDE The Force.com IDE Spring ‘10 release is scheduled for February 15th. Not sure of the new features but from what I have heard in the past you should (safe harbor) be able to copy from from SOQL search results.
Complex Data Modeling with Multilevel Master-Detail Relationships You can now include multiple levels in master-detail relationships. For example, in addition to defining a two-object master-detail relationship, such as Account—Expense Report, you can extend the relationship to subdetail records, such as Account—Expense Report—Expense Line Item. You can then perform operations across the master—detail—subdetail relationship. There are some caveats so check out the details.
Sandbox to Production—Change Sets Beta Use change sets to move configuration changes via a web interface. New enhancements include clone an existing change set, cross-version upload, delete change sets, and a six month expiration of change sets.
New UI Theme The new UI theme that was unveiled at DF09 is an org-wide update that will be available after February 5th, 2010. The new UI supports IE 7 & 8, Firefox 3.0.x and Safari 3.2.x. Sorry Chrome!
Dashboard Enhancements
With custom dashboard tables you can create tables with up to four columns, with column totals for number and currency summary fields.
With dashboard finder, you can quickly find a dashboard by typing its name in the search filter. All accessible dashboards matching that text are dynamically displayed in the drop-down list.
New visibility option for report and dashboard folders to deny access to a folder for portal users (“This folder is accessible by all users, except for portal users”).
Secure Communication with External Websites Encrypt sensitive date with certificates and key pairs whenever Salesforce.com communicates with a supported external website. Salesforce.com offers either CA-signed or self-signed certificates.
CTI 2.0 Toolkit A new toolkit for developers and partners to build more robust CTI adapters for call center users.
Globalization Enhancements
Translation Workbench Enhancements
Translatable Visualforce Email Templates
Increased Maximum Limit for Rules
Lookup Filter Beta Enhancements
Number of Remote Access Application Authorizations Increased
Enable Sidebar Search Auto-Complete Setting
Enable Single-Search-Result Shortcut Setting
A number of Auto-Complete Enhancements
Standard Action Overrides are Packageable – Standard action overrides on buttons and links are now packageable for custom objects.
Personalized Email Alerts – You can now set the From Email Address in email alerts to the address of the default workflow user.
Limited Release, Beta and Developer Previews
Adobe Flash Builder for Force.com – Developer Preview Adobe® Flash® BuilderTM for Force.com is an Eclipse-based IDE for developing Force.com Stratus apps (Adobe Air apps that leverage Force.com logic and data). Stratus applications run seamlessly online or offline while taking full advantage of the security, scalability, and reliability of Force.com. I’ve been playing with Stratus for a few months and plan to have a really cool demo with code soon.
New Report Builder – Developer Preview A new visual report builder for tabular reports (with limited functionality).
New Opportunity Page – Pilot An improved opportunity detail page with highlight panels, recommendations, and drag and drop side tabs. Available after Feb. 5, 2010.
My Domain – Limited Release You can brand your login and navigation URLs for Salesforce to create something like: https://appirio.my.salesforce.com. It also is more secure as it uses HTTPS.
Patch Updates for Packages – Limited Release Automatically upgrade your managed packages with patches. A push upgrade is a method of automatically upgrading your customers to a newer version of your package. A package subscriber doesn’t need to do anything to receive the push upgrade. If you are developing managed packages this is a must read.
Rich Text Support – Beta A new rich tech field type that is production quality but with some known limitation. The max size is 32,000 characters including HTML tags and only .gif, .jpeg and .png images are supported.
I’ve been doing a lot of work the past couple of weeks with the new Adobe Flash Builder for Force.com and the new Stratus framework. I’m in the putting together a fairly large Adobe Air demo and an accompanying blog post. In the meantime I ported a small app from Flex 3 to the new Adobe Flash Builder for Force.com and did a small screencast of some new functionality. It was a demo that I did of a way to provide a graphical representation of an floor layout (warehouse, real estate, floorplan, etc.) and show how to tie the elements to distinct records in Salesforce.com.