Nerd @ Work

When Salesforce is life!

[Javascript / Chrome / EasyPeasy] Blocking form autocomplete after Chrome Canary (version 65)

Recent Google Chrome update (65) brought something that developers are not liking too much: the autocomplete=”off” attribute on forms and inputs is no more considered.

Read in depth this Stack Overflow thread.

The solution (not so clear) is to give a random autocomplete value to the autocomplete attribute of each input of the form:

$('form input').each( function(){
   $(this).attr('autocomplete','no-autocomplete-'+(Math.random()*Math.random()));
});

Also apparently Chrome uses the name attribute (at least for email and password values), in my use case the name attribute was not necessary in the form so this script worked like a charm.

[Salesforce / Apex Test] Code coverage and logical tests in Apex Test Classes

This article is actually a repost from a buddy I came across online.

I read his articles on LinkedIn by chance and I really appreciated the easy way he writes and how he delivers important Salesforce concepts.

I choose an article about Apex Test Coverage… but before going on the article…
…please take a moment to hail our beloved lord the deployment fish!

The guest blogger

Vladimir Egikyan is a SFDC developer since 2010. Most of his career he worked for technical services providing company in Israel. During that time he helped to implement business of various companies, among which are ZIM Integrated Shipping Services, Bank Leumi.
In the latest three years he works as in-house developer and sharpen his architect skills. Though he is officially certified only as Developer… yet 😉

Writing good Apex Tests is a key to successful developing. There is a huge list of best practices and recommendations, that you can find in Salesforce documentation. Following them all, is what every developer should aim to do. Over years of developing on Salesforce, I learnt that code coverage is not what really matters…

How can that be?

Well, your coverage will raise by itself if you mind checking what your class or trigger has to do and what results you expect. Having said that, the most important thing that your test class has to do is to use System.assert methods to prove that code behaves properly. This will keep you on the safe side from any unintentional mistakes, changes in business requirements and eventually will save time and money on development process.

Okay, let’s take a look at the example:

TVRemoteControl class describes remote controls that can increase and decrease volume in scale 0-50 and have simple menu text.

Corresponding test class would contain call for each of class’ function:

TVRemoteControlTest covers the TVRemoteControl by 86% which is more than allowed minimum of 75% and these classes will deploy to production.

First and obvious defect of the test class is that it does not test if code will properly handle changing the volume beyond limits. The most important is we have to test that we get expected results in any possible use case. Our applications are almost never finished: business requirements constantly change. Besides that, we are all human and we always can make mistakes and test class is a tool that can help us to correct possible mistakes in time and that happens quite a lot.

Let’s see the better version of the test class.

This version of test class contains checking for going out of boundaries and also in each test method implements different use case and uses System.assert methods to make sure that class is performing the expected logic.

The given example is simple, but do not underestimate the importance of using assertion methods. Business logic in real life is way more complex then tv remote control, keep using these methods and you will be surprised how much time it saves for future technical support.

[Salesforce / AppExchange Series] Skyvia: easy way to load your Salesforce data into Amazon Redshift

Here we are in the next Salesforce app guest post.

Skivia is a great solution for Data warehouse in the cloud, with tens of integrations and connectors to integrate, back up, access, and manage your cloud data
with an all-in-one cloud service. With Skivia service you have to think less about where to put all your data (from all your data sources on the cloud) to concentrate on analysis.

Skyvia is not an AppExchange app but it’s an amazing service that fully deserves to be mentioned in one of the best services out there to work with Salesforce data.

The guest blogger

Jacob Martin is crazy about all stuff connected with coding, particularly all Hi-tech ones, such as Cloud computing, Big-Data, BI tools and CRMs in the broader sense.
He is a cloud engineer at Skyvia – the universal cloud data platform for no coding data integration, backup, management, and access.

With the powerful data analysis features and low storage costs of cloud data warehouse services, loading data from cloud applications to data warehouses becomes a very common task. For example, you may want to get your cloud data to a database and then use some BI tool, such as Looker, Tableau, or chart.io, or just to store your historical cloud data in a database for archiving or compliance purposes.

In this article I will describe a way how to load data from Salesforce to Amazon Redshift with almost no efforts using Skyvia service. It is a cloud data platform for data integration, backup, management and access, which can perform this task with no coding and very little configuration.

Replication Configuration in Just a Few Steps

Skyvia is a completely cloud solution that requires no local software except a web browser, and all actions in it are performed via web browser, in a convenient web GUI.

To replicate your data via service, first, you need to register on it. Creating an account is free, and you can try Skyvia within its free pricing plan that allows you to load up to 5000 records per month between cloud applications and databases.

After you create an account, on the Integrations page, click Create Now under Replication. A replication package editor page is opened.

Setting up Connections

In our example, we will use Amazon Redshift as a target database for replication. Note that you may need to configure your AWS security settings to allow access to your Amazon Redshift cluster from Skyvia’s IP – 40.118.246.204. This is necessary for Skyvia to be able to load Salesforce data into your Redshift database.

First, we select connection types in the Source and Target headers, as we want to etl Salesforce data to Amazon Redshift, will choose them respectively. Note that Skyvia also supports other data warehouses and relational databases, including Google BigQuery, Asure SQL DWH, SQL Server, PostgreSQL, etc. The full list of supported data sources you can find here.

After this, we need to create the corresponding connections. For Salesforce, the service supports both Username/password and OAuth connections. With the latter option, your Salesforce credentials are not stored on the Skyvia server. You simply enter a connection name, log in to Salesforce and allow Skyvia access to your data.

For Redshift, you need to specify the corresponding connection parameters. Note that for replication you not only need to specify main parameters for connecting to Redshift itself.

You also need to click Advanced and specify parameters for connecting to Amazon S3 storage.

To improve the replication performance, Skyvia creates CSV files with Salesforce data, uploads them to Amazon S3, and uses Redshift COPY command to quickly import data.

Selecting Objects

After you connected to your Salesforce and database, everything is simple. You will see the list of your Salesforce objects and you just need to select check boxes for the objects that you need to copy. A convenient object search allows you to quickly find and select the necessary objects.

You can perform complete or partial replication. For each object you can edit task and exclude some fields or set up filters to copy only a part of the data.

Running Replication

For one-time data loading this is enough. Click Save, and then you may run your replication.

By default, Skyvia automatically creates tables with the corresponding structure in the database, and in some minutes (depending on the volume of your Salesforce data), you will have an exact copies of your Salesforce objects in your database.

Keeping Data Up-to-date

Simple copying of data is not the only feature of Skyvia’s replication. However, for business analysis tasks it’s better to have access to as fresh data as possible. This task can easily be solved using flexible scheduling settings and allows automatically keep your copy of the data always up-to-date.

You can schedule your replication to run automatically and keep your Redshift database always synced with Salesforce. To configure a schedule open the created replication package for editing, and under Schedule (at bottom left of the package editor) click Set schedule.

Skyvia allows flexible schedule configuration. You can configure your replication to run monthly, weekly, daily, on specific weekdays, etc. In non-free pricing plans you may run replication and update your database with a fresh data from Salesforce every hour or every few minutes and get real-time insights on your data. Thus, after you configure your replication, you can easily keep your database always up-to-date.

Skyvia uses incremental updates. This means that every time it loads only the records that were changed in Salesforce since the previous package run, and applies the corresponding changes to the database. It can significantly improve performance and decrease costs, as the latter depends on the number of replicated records.

Universal Cloud Data Platform for Integration

Skyvia is a universal cloud data platform, and replication is only one of the supported integration scenarios. In addition to replication, it supports other operation kinds: import, export, and synchronization.

The replication is used when you need to simply copy data from a cloud app to a database or cloud data warehouse and automatically keep this copy in a current state with minimal configuration efforts. Synchronization synchronizes data in two sources bi-directionally. Export allows you to export data from cloud applications, like Salesforce, and databases to CSV files. Import serves for unidirectional data loading.

Import has some more complex configuration than replication, but it is much more flexible. It allows importing data from CSV files or from cloud applications and databases directly to other cloud applications and databases. Unlike replication, it doesn’t create target tables automatically. Instead you configure mapping between source and target tables and columns.

Powerful mapping settings allow you to load data between the data sources with the different data structure and formats while preserving relations between data. You can provide constant values, use powerful expressions, lookups, etc.

Import can be configured to load only newly updated or inserted records from Salesforce. Thus, we can perform a replication once to create the necessary tables and import all the data, and then configure import to load new and updated records from Salesforce.

As an all in one cloud data platform, Skyvia also offers a cloud to cloud backup solution, an online SQL query tool, and OData REST API server that can make your data available over the web.

Pricing

Skyvia’s integration pricing depends mostly on the number of loaded records. Additionally, higher pricing plans allow scheduling packages to run more often and having more scheduled packages.

Skyvia has a free pricing plan for data integration, allowing you to load 5000 records per month for free. So you can register an account on Skyvia for free and test it whether it suits to your needs and then decide whether to upgrade your pricing plan.

You can see details on Skyvia pricing on their pricing page.

Here is a handy video showing live how Skyvia works.

[Salesforce / Ecosystem] Salesforce Jobs: What’s Italian Salesforce really like?

I’m humbled and honored to present you the latest Mason Frank’s salary survey results related to the italian market.

Few days before Dreamforce 17 I asked Maria Baranowska and Alan Ferrari (managers at Mason Frank) if they could send me the raw data about Italy’s market of Mason Frank’s annual salary survey and, surprise, they gave me a fantastic article with all the details and insights from the data.

Unfortunately at this time Italy market cannot compete with more developed ones, such as U.S.A, U.K, France or Germany, but the number of company that are adopting Salesforce and the number of Salesforce addicted nerds is rapidly incresing, and I really hope we’ll see a lot of italian trailblazers coming out and invading the web!

Before leaving the proper space to this amazing article, I want to say again thank you to two great Mason Frank’s trailblazers:

  • Alan Ferrari [Manager at Mason Frank INternational] who wrote the final version of this post and gave it a true italian market value!
  • Maria Baranowska [Outreach Executive at Mason Frank International] who I contacted first, granted me access to the draft italian data through a first draft of this post

Alan Ferrari

Focused on makes candidates’ lives better since 2009, I’ve started my career as an HR Assistant & Internal Recruiter Specialist. After a couple of experiences in our beautiful country as an HR&Talent Acquisition Manager I’ve decided to move out and try to expand my knowledge in UK moving deeper in the mysterious world (at that time) of Salesforce.com.
My adventure started with the opening of the Italian Market for the Frank Recruitment Group, and during my “years of service” I’ve contributed in the opening (and currently managing) of several foreign markets like Spain, Portugal, Central East Europe and Nordic Regions.
Passioned about IT and “Human Capital”, I’m trying to challenge myself everyday more and more in order to stand out from other recruiters bringing Mason Frank International to another level and keeping the standards as the world leader recruitment company in SFDC and Marketing Automation.

Salesforce is the leader of the CRM market and one of the most successful technologies available today. Unlike many other tech companies who may parallel in innovation within their own field, Salesforce has cultivated a unique ecosystem (including but not limited to the Ohana) which makes it stand out from the rest.
That being said, what’s it like to be part of the Ohana in different parts of the world? In which countries can Salesforce professionals earn most and expect the greatest growth in the coming years?

Let me present myself first…

My name is Alan Ferrari and I am a Manager at Mason Frank International, the world’s leading Salesforce recruiter company.

Over the last few years, I’ve been learning about what it’s like to work in Salesforce.

Today, I’m going to share some of the most relevant insights I’ve picked up and help you understand one Salesforce market where I specialise most, Italy.

As you might know, every year, Mason Frank release their salary survey, where people working with Salesforce can find information and salaries for different positions, both technical and functional.

For the first time this year, due to popular demand, we’ve decided to include Italy in our research. Releasing the data exclusively here on Enrico’s blog, we will explore salaries in this growing market and speculate what the future may hold for professionals living here.

Needless to say, demand and salaries are not close to that of other countries where the technology has been active for a decade. This is clearly evidenced in the Salesforce salary survey report.

The good news is that in the last three to four years, the average salary in Italy has increased by more than the 60% in functional positions and more than the 80% in the technical professionals.

This is likely the result of the investment in the South of Europe over 2016/2017, managing to substantially increase the demand of professionals in this technology.

Here you can find the average Italian Salesforce salaries for each of the main positions:

Roles Junior (0-3 years) Mid (4-7 years) Senior (8 years+)
Salesforce Manager 55,276 58,387 62,443
Project Manager 48,976 49,246 50,266
Technical Architect 55,298 57,147 60,527
Solution Architect 43,194 44,624 45,626
Technical Consultant 33,225 39,556 45,886
Functional Consultant 25,313 32,739 40,165
Developer 30,287 34,376 38,464
Business Analyst 28,773 32,349 35,924
Administrator 22,377 24,758 26,575
Marketing Automation Manager 40,179 41,878 43,967
Marketing Automation Specialist 30,112 32,453 35,249

Oh, the good old times!

I can’t forget the moment I completed my first placement in Salesforce.

I was working with a man who studied and worked in Salesforce for three to four years in the UK and was dreaming of coming back in Italy, so badly in fact, that was ready to accept a big cut in his salary in order to return.

He was soon hired as a Senior Developer for the incredible salary of 24,000€. If you look at the table above, the average salary is now about 10,000€ more. Incredibly, this didn’t happen 10 years ago, but the market has shifted so quickly this increase has happened in a fraction of time.

If you take a look at the rest of Europe, you will find different ranges of salaries in different countries, most of them being higher than in Italy.

That being said, what I’m often explaining to the job seekers I work with is:

  1. The Italian ecosystem is fairly new.

    There are countries such as UK, Germany or France where Salesforce has been growing for more than seven or eight years and is established as one of the most important players in the CRM world.

    In Italy, only in the last 5 years (excluding our pioneer) has the technology been taken in the right consideration. This means the demand for people still isn’t the same as in other countries.

  2. Cost of living. I’ve heard so many times people asking me to help them go to other countries because of the ‘unbelievable salaries’. What people don’t often realise is that the cost of living in a different city could be higher and what you take home at the end of the day might be less than what you have elsewhere. This is very relevant in Italy in particular.

So, what can we expect in the upcoming years?

As a recruiter, I can tell that the demand for SFDC professionals will reach sky-high levels during 2018. We are constantly looking for an increasing number of people and over the last three years, this demand has increased by a huge 160%.

New companies are adopting Salesforce and creating jobs every month.

Typically, the average Manager or Senior Manager in Italy is aged around 45 to 48 years old. In Salesforce, people are excelling to these positions around aged 32 to 35 years old. This is largely due to the fast growth and understaffing in this geographical market.

Skills and education

Another great asset of working with Salesforce, in Italy and beyond, is the lack of demand for a strict IT or technical background.

Furthermore, there is a general belief that formal, higher education isn’t a must. This year’s Salesforce salary survey revealed two-thirds of respondents don’t believe a degree is important to pursue a career in Salesforce (has been confirmed by most companies as well).

This means professionals can start climbing the corporate ladder sooner, often straight out of school. This is likely to give a greater of people the platform to enter tech careers and breakdown any previously existent stigmas.

Throughout my career as a Salesforce recruiter, I’ve learned that the average duration of a career in this field is around 12 to 18 months for junior positions, increasing to a longer term – otherwise known as tenure – with more senior positions. This could be due to the project-driven style of working within Salesforce.

This is a trend we’re seeing across the world. In developing Salesforce markets like Italy, this can be a great asset to workers as it gives flexibility and can allow people in a range of positions, from Admins to Developers, to experience a wide range of projects and products. It makes the market more dynamic, interesting, and challenging.

Inclusivity and gender diversity

Finally, Salesforce sets an example for their inclusivity and gender diversity. Since the boom of Salesforce, the number of women in IT has increased from 2.8% to 12%. Their own internal encouragement of coding for women, and accommodation of parental rights, sets an example to other businesses, especially those in their own ecosystem.

This attitude is particularly refreshing in developing markets, like Italy.

It could pave the way for drastic change in the representation of women in technology across the country.

What does this mean for you?

If you are working in Salesforce, or considering a career in it, there has never been a better time to do so, particularly in a country where the technology’s growth is high.

If you’re unsure of what you should be earning, consult resources like Mason Frank’s salary survey and compare your earnings against others.

If you need any advice on your Salesforce career prospects, don’t hesitate to get in touch with me directly and I’d be happy to do what I can to help.

You can find me on LinkedIn.

Good luck!

[Salesforce / Translation Workbench] Import/Export translations betwen ORGs with different metadata configuration

This guest post is written by one of the most powerful coworkers I’ve been working with in the last years.

His name is Tommaso Bolis and I call him the Robo-Bolis because I believe he’s a smart and super productive top coder, and sometimes make me fear he’s not human!

Jokes aside, it’s months I’m asking him to write as a guest blogger for my blog and finally he decided to put some of his knowledge inside this humble blog.

Tommaso Bolis is a Solution Architect and Salesforce Senior Developer at WebResults, a Salesforce platinum italian partner. His main interests span from backend development to DB administration, to Javascript frontend development and, ofcourse, Salesforce.

If you are the kind of guys belonging to the TL;DR party, here is an amazing GitHub repository with all the code to solve the challenge in the post’s title.

Background: Multi region and content management

During one of my last projects I had to introduce on one of our customer’s site/community the multi region (EMEA, APAC, …) content management and the multi language support.

This last requirement was particularly challenging (we are talking about 8 different languages including Japanese, Korean and Arabic…), but I don’t want to bother you with what have been done to accomplish the goal, I just want to tell you about one problem I have been facing trying to move translations among our different orgs.

If you have already played with translation workbench you know for sure how trying to export/import translations can be tricky.

The challenge: ORGs with different metadata configuration

The point is that if two orgs differ for some reason in terms of translatable metadata than the export/import process can fail and a manual adjustment of the exported data can be necessary in order to import the data inside the destination org without errors.

For example, if you have a custom label on the source org that has not been deployed on the destination org, when you try to export translations from the source org the resulting files will contain translation for this custom label and trying to import these files will result in errors.

Solution: Python app to rest easy

In order to solve this annoying problem I developed a Python script that takes files exported from the source org and process it removing all references to metadata that does not exist on the destination org.

In this way it is possible to import files without errors!

The idea is to use files exported from both orgs source and destination and simply remove everything is on source files but not on destination files.

This operation is enough to obtain a set of translation files that can be imported without errors.

Jump to this GitHub repository, fork it and follow the README.md file to run the magic!

Maybe around the web something similar already exist, but I can’t say no when I’ve to work on a good handcrafted script.

[AppExchange series] 10 best things you can do offline with Salesforce data (and Resco Mobile app)

Happy new year to everyone!

First post of 2018 celebrates the AppExchange: the call for guest AppExchange posts is getting a lot of answers and amazing ISVs want to share their app.

In this guest post I want to present you the Resco Mobile App, an amazing solution for Salesforce offline management, fully customizable with no coding skills, that leverages the power of Salesforce when the Salesforce app is not enough!

I’ll leave the word to our guest blogger Barbora Piatrová, Content Strategist at Resco.net.

Barbora Piatrová takes her passion for digital marketing & mobile CRM everywhere she goes. Currently, she’s involved in creating & mastering content strategy at resco.net – one of the leading companies in the world for Mobile CRM. She is now actively also discovering and participating in new thriving communities for Salesforce enthusiasts.

Offline matters. Especially nowadays.

Even in Europe, where Internet connectivity is generally perceived as very good, there are areas and countries with poor 3G and 4G support. There is a pocketful of places with poor or no connectivity possible. What about the garages, planes, rural/uninhabited areas, or elevators?

Offline is now available for Salesforce users in the field, indeed. Including sales professionals and field service technicians. The question is, how much offline can we actually get? Is access to the last 5 recently viewed objects what a field technician truly need? The same guy whose mission is to complete all the planned tasks, inspections or sales visits needs permanent offline access to all Salesforce data. It doesn’t end here though. A motivated sales and field service rep wishes to fulfill the mission irrespective of internet connectivity. Continuous work is necessary even in areas where such limited offline would not help.

Consider true offline. Follow the leaders.

Resco is among the leaders in providing world-class offline mobile solutions for various back-end solutions, including Salesforce.

You might have noticed that offline capability is currently being added to mobile apps by most CRM vendors such as Salesforce, Microsoft, and others. In our opinion, offline is not a capability, which can be easily added to an online CRM app. Offline doesn’t only mean to add a local database support, providing the CRM data when the app is disconnected.

Offline means that ALL the features and functionalities of the mobile CRM app are available also when the app is disconnected – with no limitations. Thus, the logic of every feature must be developed and implemented to the mobile app independently from the server. Otherwise, a feature will simply not work when the app is disconnected. But a mobile CRM app is usually the main business tool of every mobile sales or service professional. So, if it doesn’t provide 100% of functionality anywhere and anytime, it can cause immediate damages for a company’s business.”

Radomir Vozar, CEO at Resco
The primary focal point of Resco Mobile CRM is its offline capability. It has been implemented since the very beginning of its development. A complete, robust mobile solution, ready to serve its users whenever and wherever they happen to be. A completely different story in comparison to online CRM apps with offline capabilities.

In every release, we launch approximately 40 new features and improvements to our mobile app, including offline features. 18 years of development and hard work brought over 700 mobile features to life! And so, believe me, it was no easy feat, but we did come up with a list of 10 most used & useful features that prove that (in this case) both quantity and quality matter.

How to work with Resco Mobile App in an offline mode?

The same as if you’ve never left the room with wi-fi, switched off your mobile internet data or lost connection!

What exactly do we get in Resco with full offline support?

  1. Business logic (not just data)

    Offline-first approach means, you can perform complex business processes and constraints allowing you to not only view – but create or edit business logic of the solution that works offline.

  2. Maps

    System admins can define which maps will be stored in the local memory, so users can use the map view even without wi-fi or cellular connection to the Internet.

  3. Document management (viewing and editing)

    Offline-capable solution knows no limitations. When working with documents (pdf, HTML, MS Office, MS Excel, HTML, SharePoint, Dropbox) offline, you can simply set up the filters that dictate which files should be downloaded to the offline database in your phone or tablet.

  4. Knowledge base articles

    You get to not only access, but to play around with the articles about products, parts, and more. Filter articles of any format (pdf, HTML, video, audio, image…), copy them, add to favorites, associate with case or edit its details.

  5. Reports

    Yes, that’s right! You can generate pdf reports on spot limitlessly. Generate and work with them even further. Want to store a report? Send it or print? It’s all up to you.

  6. Offline HTML

    Who wouldn’t want to create their own business logic to the app for Salesforce? You can expand the app with tailor-made forms to add product presentations or to replace the standard user interface – all with offline HTML. Create stunning pres¬entations, get the scoop on your prospects by quickly looking at their online presence. Iframes allow you to show any HTML content in the application.

  7. Lead conversion

    Did you know you can qualify/disqualify leads or convert them to a closed deal even offline? Yes, automated processes truly simplify the lives of sales guys on-the-go. Finally, you can nurture your leads properly.

  8. Multimedia

    Show product presentation or attach pictures to your notes or any Salesforce record at any time! You can upload, edit, and delete multimedia including images, audio & video files (JPEG, PNG, AVI, etc.) and other formats.

  9. Quotes

    Can’t create a quote while disconnected? That’s no longer a challenge. You can freely create a quote with respect to an actual corporate product catalog and its pricing policy.

  10. Faster performance

    App performance is not to be underestimated in the enterprise space. With offline this robust, you don’t ever have to worry about waiting for network transactions to take place. Database reads and writes are stored locally, so the tasks are being completed instantly.

    And there is plenty more you can do! Endless offline capabilities include task management, notes and business information editing, offline managements of all objects (standard, custom), product/parts management, offline calendar, favorites, and so much more.

*Note that:
In offline mode, the database is stored locally on the de¬vice (for offline capability and faster performance of Resco Mobile CRM) is encrypted by default. The data encryption is based on an application key. The appli¬cation key is randomly generated when the database is created and protected by the user’s password. The key is stored in an encrypted form in device’s file system and decrypted when needed.

Curious to see real offline mobile solution for sales and field service scenarios in action? Simply, drop Resco a line at [email protected] or request a demo at the website!

[AppExchange series] Calling all Ohana and ISVs!

Do you have a #Salesforce app on the Salesforce AppExchange?

Wanna share its super powers with the world?

#NerdAtWork is more than happy to blog about it and host your awesome app!

DM me on Twitter or contact me at [email protected]!

Can’t wait to host amazing guest posts!

I WANT YOU!

[Salesforce / ORGanizer] Christmas Release 0.6.5 is live!

A new Christmas gift for my ORGanusers.

Christmas Release 0.6.5 is live!

It’s months I’ve been asked for an ORGanizer Firefox version and, drum roll…it is finally live!

It’s an important milestone: the ORGanizer can now be enjoied on the most widespread browsers.

That’s why I’m here to ask you to register to the ORGanizer beta program: I can track who wants to help me in enhancing our beloved extension, send them early releases (before the official production release), making the ORGanusers a community in our amazing Ohana community!

What’s more?

Increased usage limit

  • 200 total accounts
  • 150 total sync accounts

Conrt SF Id plugin now has a quick action to copy the current SF ID on the clipboard.

Configure all plugin shortcuts from the Options page:

Enhanced Formula plugin now plays correctly on Lightning Experience!

Follow the release notes for more details!

Don’t forget to Support the ORGanizer, the Best Salesforce Extension ever!

[Salesforce Ohana] Movember Cloud: a chat with Paolo Bergamo and the future of the italian Salesforce tech community

Italian Pride

I always say I’m a proud italian nerd.

This doesn’t mean I think everything from Italy is always the best, but I recognize that we, as Italians, can do a lot of beautifull things, from culture (I’m not talking about our politicians…but who does?) to food (I’m talking about spaghetti, but not about my code).

I’m writing this post (with a bit of delay) because I’m really proud of how me and my friends (with a bit of help from amazing people that I’m about to talk about) have organized a wonderful Salesforce Developer & User Group (DUG) few weeks ago in Milan.

This is the poster of the event:

Paolo Bergamo, who are you?

Few months ago (maybe more that a few, actually) I’ve been contacted by Paolo Bergamo, a Salesforce manager that lives in San Francisco and…drum roll. is italian!

At the time of the call I didn’t know who he was, but I was really hubled by the fact that a Salesforce VP wanted to talk with me to understand how Italian Salesforce devs where set up.

We met in person at the Milano Essentials and we felt really close, despite the fact I was (and am) none and he is actually one of the people that makes Salesforce great for its customers and also for us developers.

About 3 months ago Paolo and Nino Guarnacci (Cloud Solution Engineer at Salesforce) came back to me, introducing the possibility to increase and enhance our italian Salesforce technical community, because I was (and luckily still am) the only italian MVP and I was active online, so there is a bunch of italian guys that already has heard my name. They thought I could help them spread Salesforce Ohana in the italian community.

This is something I’m trying to do since I was nominated MVP, but it’s not easy and that’s the reason we’ve set up the Milano Developer Group with my beloved buddies Gianluca Perrone, Tonino Tripodi and Stefano Massoni.

The Movember Cloud Event

What’s the best way to make people come to the Salesforce side and enhance the community?

#1 Sharing amazing trailblazers stories, and Paolo Bergamo was a beautiful example of an amazing life (he’s a close friend with Mark Beniof and worked with Steve Jobs).

#2 Setting up a centralized italian Salesforce dev Community and Nino knows how this job must be done (he was one of the founders of Codemotion).

The Movember Cloud event (the name if deliberately funny) has been a real success: we still don’t have the power to acquire hundreds of people but we had more than 80 people that came to hear about Paolo Bergamo’s life and his funny stories about Mr. Jobs and Mr. Beniof, like when he’s been secretly kidnapped by Apple to develop one of the first Apple Store apps (and it was a Salesforce app) and Steve Jobs told him it was all but shit (seems incredible…but I believe every dev in the world accepts to be told this by Steve Jobs!!), or when Paolo told us that Mark Beniof loves emoticons and usually sends him a funny italian emoticon of a guy that east spaghetti…

I told Paolo to talk freely and he took my word and took the scene for an entire hour, letting people speachless with a lot of inspiring stories about his working life and his career in the Salesforce ecosystem.

This is the full meeting record (only in italian) the covers all the night.

If you want to watch me and Paolo and learn some italian (if you don’t already speak italian), please hit play on this video!

Paolo (and all the swag Paolo and Nino brought) was actually a bait, because we want to make people listen to what me and Nino were planning in the last month: create the very first Salesforce Italian Dev (and Admin) Community.

It is something really amazing that could really increase italian presence in the Salesforce world.

The Ohana Community and Nino Guarnacci

As I said at the event, Italy is full of talented people and I cannot figure out why there is only one MVP…the aim of this community is to leverage italian devs & admins skills and make Italian the biggest country community at Dreamforce 2018!

There is still a long way but Nino has already set up the Ohana.community domain (I cannot believe he got it!!!) and this is the starting point for our efforts!

This will be the focal point of italian Dev & Admins, a place where we can share knowledge and introduce people to the Salesforce world, share people, jobs, frienship and whatever we want.

The only way to start our journey is to send an email to [email protected] providing your name, email, social accounts and wait for the magic to happen (we are still setting up the public community).

The community will be responsible for itself: a commitee will manage the ORG (yes we are setting up a Salesforce Community with Chatter and glitters) and everyone will be given the power to put their hands on it: the more you share and be available to do stuff, the more powers you’ll have in the community!

Here is the full presentation deck presented by Nino.

Next steps?

With the power of the community we want to make the first all italian Slaesforce tech event, but we need your help!

Do you want to help us? join the Ohana Community NOW!

[Salesforce / TheMoreYouKnow] Campaign Member Status Configuration

Disclaimer
This is a “better write it down for the future me” post.

For the TL;DR pals, this is the Github repository.

It was years I wans’t working with Campaigns, so it took me a while to remember a simple thing: you cannot automate
Campaign Member Status configuration with point & click
.

It seems awkward, mostly because you have a Status picklist field on the Campaign Member.

And when you cannot find the New button on the picklist related list of that field you start feeling depressed.

After a while (you don’t really need much time, just google it a bit) you find out there is a wonderful Campaign Member Status object, that holds the details of a specific Campaign’s members statuses.

Then you learn (again) that you need to use the Advanced Setup button (in Classic) or the Campaign Member Status related list (in LEX):

When you add a new value the list of values in the Campaign Member Status is automatically updated:

So the next question is:

How to automate this?

Well, unfortunately you can’t, you have to manually create the Campaign Member Status values on every Campaign you create.

If your users create campaigns often, believe they won’t accept it as a solution!

As a simple solution we can:

  • correlate Campaign Member Status values to Campaign Record Types
  • store Campaign Record Type / Campaign Member Status Value couples inside a Custom Metadata object
  • implement a trigger that executes on campaign create or if its record type changes

CampaignMemberStatusConfiguration__mdt

Name and Label standard fields will not be used to store actual values for our feature implementation, becausr they can only store 40 chars that is definitely less than 80 required for Record Type Developer name and 765 required for Campaign Member Status value (we’ll be using max 255 chars in this implementation).

Campaign Record Types

Custom Metadata values

Apex Code algorithm

The following code, invoked from the Campaign trigger, calculates the new Campaign Member Status objects, removing the old one and creating the new ones.

/**
 * @author Enrico Murru (https://enree.co, @enreeco)
 * @description Creates CampaignMemberStatus records based on custom metadata object configuration
 */
public class CampaignTriggerHandler {
        
    public static void execute(){
        //new statuses to be created / updated (with default or responded)
        List<CampaignMemberStatus> defaultOrRespondedStatuses = new List<CampaignMemberStatus>();
        //new statuses to be created / updated (without default or responded)
        List<CampaignMemberStatus> otherStatuses = new List<CampaignMemberStatus>();
        //statuses to be deleted
        List<CampaignMemberStatus> deleteStatusesList = new List<CampaignMemberStatus>();
        
        //selected campaigns
        List<Campaign> cmpList = new List<Campaign>();
        //record types
        List<ID> rTypesList = new List<ID>();
        
        //select only campaigns that are inserted or that changed their record types
        for(Integer i = 0; i < Trigger.new.size(); i++){
            Campaign nCmp = (Campaign)Trigger.new[i];
            if(!Trigger.isInsert
                && nCmp.RecordTypeId == ((Campaign)Trigger.old[i]).RecordTypeId) continue;
            cmpList.add(nCmp);
            rTypesList.add(nCmp.RecordTypeId);
        }
        
        if(cmpList.isEmpty()) return;
        
        //delete standard statuses
        deleteStatusesList = [SELECT Id, Label, CampaignId, IsDefault, HasResponded 
                              From CampaignMemberStatus 
                              Where CampaignId IN :cmpList
                              Order By Label];
        
        //query record types
        Map<ID, Recordtype> rTypeMap = new Map<ID,RecordType>([Select Id, DeveloperName From RecordType 
                                                              Where SObjectType = 'Campaign'
                                                              and Id IN :rTypesList]);
     
        for(Campaign cmp : cmpList){
   
            //we can do as many query as we want with custom metadata
         for(CampaignMemberStatusConfiguration__mdt cmsc : [SELECT Id, RecordTypeDeveloperName__c, 
                                                            StatusValue__c, SortOrder__c,IsDefault__c, Responded__c 
                                                            FROM CampaignMemberStatusConfiguration__mdt
                                                            WHERE RecordTypeDeveloperName__c = :rTypeMap.get(cmp.RecordTypeId).DeveloperName
                                                            ORDER BY StatusValue__c, IsDefault__c DESC, Responded__c DESC]){

    //gets CMS with same label (avoid duplicates on upsert)
    CampaignMemberStatus oldCMS = null;
    for(Integer ci = deleteStatusesList.size()-1; ci >= 0; ci--){
                    CampaignMemberStatus cms = deleteStatusesList[ci];
     if(cms.CampaignId != cmp.Id) continue;
                    if(cms.Label == cmsc.StatusValue__c){
                        oldCMS = cms;
                        deleteStatusesList.remove(ci);
                        break;
                    }
    }
                                                                
    CampaignMemberStatus newCMS = new CampaignMemberStatus(Label = cmsc.StatusValue__c,
                                                             SortOrder = cmsc.SortOrder__c.intValue(),
                                                             IsDefault = cmsc.IsDefault__c,
                                                             HasResponded = cmsc.Responded__c);
    if(oldCMS != null){
                    newCMS.Id = oldCMS.Id;
                }else{
                    newCMS.CampaignId = cmp.Id;
                }
    if(!newCMS.IsDefault 
                   && !newCMS.HasResponded){
     otherStatuses.add(newCMS);
    }else{
                 defaultOrRespondedStatuses.add(newCMS);            
    }
   }
        }
  //this DML sequence guarantees no conflicts
        upsert defaultOrRespondedStatuses;
        delete deleteStatusesList;
        upsert otherStatuses;
        
    }
}

Find all the details in this Github repository.

Page 14 of 26

Powered by WordPress & Theme by Anders Norén