LET'S LEARN TOGETHER. THE BEAUTIFUL THING ABOUT LEARNING IS NOBODY CAN TAKE IT AWAY FROM YOU.

Quick Reference of Arrow Function in JavaScript


Arrow functions were introduced with ES6 as a new way of writing JavaScript functions. This post will cover basic syntax of Arrow functions, common use cases.

What is Arrow Functions?

Arrow functions, sometimes referred as Fat Arrow is a new concise way of writing functions. They utilize a new syntax, => which looks like Fat Arrow. Arrow functions are anonymous and change the way this binds in functions. By using arrow functions, we can avoid typing function and return keyword and also curly brackets.

Basic Syntax of Arrow Function with Multiple Parameters

const multiplyFunction = (x,y) => (x*y);
console.log(multiplyFunction(5,6));

You can execute the code here.

Syntax of Arrow Function with Single Parameter

const splitString = text => text.split(" ");
console.log(splitString("My name is Sudipta Deb"));

You can execute the code here.

Syntax of Arrow Function with No Parameter

const functionWithNoParam = () => {
  console.log('This function with no parameter');
}

functionWithNoParam();

You can execute the code here.

Syntax of Arrow Function with Object return

Arrow functions can be used to return an object literal expressions. 
var funcWithObject = (empName, empNumber) => ({
  empName : empName,
  empNumber : empNumber
});
console.log(funcWithObject("Sudipta Deb",101));

Here is the output
[object Object] {
  empName : "Sudipta Deb",
  empNumber : 101
}

You can execute the code here.

Use Cases for Arrow Functions

One very common use case for Arrow function is Array manipulation. In the below example, each array items will be converted to upper case.

const countries = ['India', 'Canada', 'Switzerland', 'Germany'];
const countriesWithCaps = countries.map(country => country.toUpperCase());

console.log(countriesWithCaps);

You can execute the code here.

Another little advanced example is when you want to return something from array which meets the criteria. So in the below example, I would like to return only those tasks which is completed.

const myTasks = [{
  description: "Write Blog Post",
  status: "Completed"
}, {
  description: "Study Architect Certification",
  status: "Pending"
}, {
  description: "Go for walk",
  status: "Completed"
}];

const completedTask = myTasks.filter((myTask) => myTask.status === 'Completed');

console.log(completedTask);

You can execute the code here.

Now if I want to just print the description instead of everything, we can use another Arrow Function to do that like below

const myTasks = [{
  description: "Write Blog Post",
  status: "Completed"
}, {
  description: "Study Architect Certification",
  status: "Pending"
}, {
  description: "Go for walk",
  status: "Completed"
}];

const completedTask = myTasks.filter((myTask) => myTask.status === 'Completed');
completedTask.forEach(singleTask => console.log(singleTask.description));

You can execute the code here.

Promises and Callback

Promises make it easier to manage async code. This is the perfect situation to use Arrow function. Here is the syntax

this.doSomething().then((result)=>{
  this.handleResult(result);
});

Places not to use Arrow Function

Let's consider the below object which is having one method describeMe() which is returning a String. 

const Car = {
  brand : 'Honda',
  price : 132000,
  describeMe : function(){
    return `I am ${brand} car with price ${price}`;
  }
}

console.log(Car.describeMe());

If you execute the above code, you will get undefined error while accessing brand and price. To solve that, let's use This now to bind brand and price with the Car object context. So now the code looks like -

const Car = {
  brand : 'Honda',
  price : 132000,
  describeMe : function(){
    return `I am ${this.brand} car with price ${this.price}`;
  }
}

console.log(Car.describeMe());

And this time you will see the correct message. You can execute the code here.
Now if you think of replacing describeMe function with Arrow function, it will look like below -

const Car = {
  brand : 'Honda',
  price : 132000,
  describeMe : () => `I am ${this.brand} car with price ${this.price}`
}

console.log(Car.describeMe());

But this time you will get again the undefined error. Why???
This keyword is bound to different values based on the context in which it is called. With Arrow Function, it is little different. Here This is lexically bound i.e. it uses this from the code that contains the arrow function. So Arrow Function should not be used in Object methods.

Wrapping up

Arrow function is a great addition to JavaScript language and with this for concise code can be written.

Further Reading

Share:

Class-based vs Prototype-based Programming using JavaScript


Douglas Crockford described JavaScript as the world's most misunderstood language. Like many developers, when I started learning JavaScript, to me also, this was not a "proper" language. But I quickly understood that JavaScript comes with a rich system of object-oriented programming.

There are many concepts that makes JavaScript unique, but prototype model is definitely the most important one and it creates many confusions. So having a clear understanding of prototype model is very important. And in this post, I would like to explain the concept of prototype based programming in JavaScript.

The prototype based programming is a very easy to understand concept, but the source of confusion is the syntax. When a new developer looks at the JavaScript code and sees new, class or constructor it makes them think that object instantiation works the same way as other languages. But in reality, they are nothing more than syntactic sugar in JavaScript. Behind the scenes, things are working in different way. So it is very important to have a clear understanding how things works which will help you to predict their behavior.

Class Based Language

A class based language (Java, C++, C# etc.) has two important concepts:
  • class - the interface which defines the properties and methods.
  • entities - instantiations of the class (objects)
 An instance is exact same copy of the class, you cannot dynamically add/remove properties/methods from the instance as declared in the class.  You can definitely override them, but then it comes to inheritance. In this model, one instance belongs to one class only. Of course, those classes can also inherit from others. This is how Class Bases language works.

Note - There are some programming language like Python and Ruby which provide the way of dynamically change the attributes.

Prototype Based Language

Here we don't have the concept of classes or entities. It's only objects. An object can specify it's properties either at declaration or at runtime.
Let's see the below example:
//Property name at declaration
var student = {
  "name":"Sudipta Deb"
}

//This will throw an error as the function is not yet defined.
student.sayFullName(); 

//Let's add the function as runtime
student.sayFullName = function(){
  console.log('FullName: ' + this.name);
}

//This time it will print the fullname
student.sayFullName();

Check example here. Initially the method sayFullName() was declared, but it was added dynamically later.

Understand Prototype Object

Without classes in JavaScript, inheritance is only possible due to Prototype objects. Here are few important pointers to understand Prototype object.
  • A prototype is an object which is used as template from which all new objects will get their properties.
  • Any object can be used as a prototype for another object and share the properties with that object.
  • The object can override the inherited methods/properties, but it will not impact the prototype.
  • The prototype can change it's methods/properties or add new ones, which will impact the objects which was created from the same prototype.
So basically we create copies from one object and then all copies will move with their own life. The new object will have access to all the methods/properties of the prototype as long as they are not overridden. Even if there is any method/property being added to the prototype class after the object creation, object will still have access to those newly added method/property. Any changes in the object will not impact prototype, but any change in prototype will impact all objects. This is the core of prototype based programming. Let's understand this below example.

Vehicle Example


Let's create the hierarchy in JavaScript. 
First the Vehicle definition.
 function Vehicle(){  
  this.manufacturers = '';  
  this.year = '';  
 }  

Let's the create the two sub classes for Vehicle i.e. Bus and Car as below

//Definition of Vehicle Object
function Vehicle(){  
  this.manufacturers = '';  
  this.year = '';  
} 

//Definition of Bus Object
function Bus(){
  Vehicle.call(this);
  this.routeNumber ='';
}
Bus.prototype = Object.create(Vehicle);
Bus.prototype.constructor = Bus;

//Definition of Car Object
function Car(){
  Vehicle.call(this);
  this.type = '';
}
Car.prototype = Object.create(Vehicle);
Car.prototype.constructor = Car;

Every object in JavaScript has a __proto__ attribute which basically points to its prototype. This attribute creates the link in prototype chain. In Javascript, you add a prototypical instance as the value of the prototype property of the construction function and then override the prototype.constructor to the construction function.

So prototype property holds the parent object. When an object is created through Object.create, the passed object is meant to be the prototype of the new object. 

So now let's extend the example above and create GasolinCar and ElectricCar. 

//Definition of Vehicle Object
function Vehicle(){  
  this.manufacturers = '';  
  this.year = '';  
} 

//Definition of Bus Object
function Bus(){
  Vehicle.call(this);
  this.routeNumber ='';
}
Bus.prototype = Object.create(Vehicle);
Bus.prototype.constructor = Bus;

//Definition of Car Object
function Car(){
  Vehicle.call(this);
  this.type = '';
}
Car.prototype = Object.create(Vehicle);
Car.prototype.constructor = Car;

//Definition of Gasolin Car
function GasolinCar(){
  Car.call(this);
  this.mileage = '';
}
GasolinCar.prototype = Object.create(Car);
GasolinCar.prototype.constructor = GasolinCar;

//Definition of Electric Car
function ElectricCar(){
  Car.call(this);
  this.batteryCapacity = '';
}
ElectricCar.prototype = Object.create(Car);
ElectricCar.prototype.constructor = ElectricCar;

The new Operator

Let's start with the below example:

//Let's create new objects now
var teslaGasolinCar = new GasolinCar();
teslaGasolinCar.mileage = 12;
teslaGasolinCar.type = 'Car';
teslaGasolinCar.manufacturers = "Tesla";
teslaGasolinCar.year = 2018;
console.log('Mileage:' + teslaGasolinCar.mileage);
console.log('Type:' + teslaGasolinCar.type);
console.log('Manufacturer:' + teslaGasolinCar.manufacturers);
console.log('Year: ' + teslaGasolinCar.year);
console.log('__proto__: ');
console.log(teslaGasolinCar.__proto__);
console.log('prototype: ');
onsole.log(teslaGasolinCar.prototype);

When using the new operator to create object from a function, below things happen behind the scene:

  • A generic object is created.
  • The __proto__ is set to GasolinCar.prototype
  • Finally GasolinCar function is called, with this representing the newly created object
Now when the above example is executed, here is the output in the console. 

Note - 
__proto__ is holding the GasolinCar.prototype, and prototype is holding Car object. This is how the inheritance is created in JavaScript.

It's important to understand that the constructor/function role is to help creating prototype chain between the newly created instance and it's parent object. After that, it is having no other job. Therefore, there is no direct link between the instance and the function/constructor. 

teslaGasolinCar instance and GasolinCar function have no direct reference to each other.


You can run this example here.





Create Multiple Objects with new Operator

You can create multiple objects with new operator, but each object will get their own property.
In the below example, I have created two objects of same type as -

//Definition of Vehicle Object
function Vehicle(){  
  this.manufacturers = '';  
  this.year = '';  
} 

//Definition of Bus Object
function Bus(){
  Vehicle.call(this);
  this.routeNumber ='';
}
Bus.prototype = Object.create(Vehicle);
Bus.prototype.constructor = Bus;

//Definition of Car Object
function Car(){
  Vehicle.call(this);
  this.type = '';
}
Car.prototype = Object.create(Vehicle);
Car.prototype.constructor = Car;

//Definition of Gasolin Car
function GasolinCar(){
  Car.call(this);
  this.mileage = '';
}
GasolinCar.prototype = Object.create(Car);
GasolinCar.prototype.constructor = GasolinCar;

//Definition of Electric Car
function ElectricCar(){
  Car.call(this);
  this.batteryCapacity = '';
}
ElectricCar.prototype = Object.create(Car);
ElectricCar.prototype.constructor = ElectricCar;

//Let's create Tesla objects
var teslaGasolinCar = new GasolinCar();
teslaGasolinCar.mileage = 12;
teslaGasolinCar.type = 'Car';
teslaGasolinCar.manufacturers = "Tesla";
teslaGasolinCar.year = 2018;
console.log('Printing Tesla Car:==>');
console.log('Mileage:' + teslaGasolinCar.mileage);
console.log('Type:' + teslaGasolinCar.type);
console.log('Manufacturer:' + teslaGasolinCar.manufacturers);
console.log('Year: ' + teslaGasolinCar.year);

//Let's create Ford objects
var fordGasolinCar = new GasolinCar();
fordGasolinCar.mileage = 11;
fordGasolinCar.type = 'Car';
fordGasolinCar.manufacturers = "Ford";
fordGasolinCar.year = 2019;
console.log('Printing Ford Car:==>');
console.log('Mileage:' + fordGasolinCar.mileage);
console.log('Type:' + fordGasolinCar.type);
console.log('Manufacturer:' + fordGasolinCar.manufacturers);
console.log('Year: ' + fordGasolinCar.year);

You can run this example here.



Conclusion

I hope you have a much clear understanding of how prototype based programming is used in JavaScript. In JavaScript, you can create objects in multiple ways, but as long as you understand the basic, it will be easy for you to understand and pick the correct way.

Thank you for your time and please feel free to provide your feedback in comments below.

Further Reading


Share:

Kitchener Developer Group Event: Introduction to Lightning Web Component by Mohith Srivastava



Special thanks to our speaker, Mohith Srivastava, for sharing his knowledge on Lightning Web Component. 
Here comes the presentation and recording.

Presentation:

Recording:

Please register to Kitchener, Canada Developer Group for all our future events.
Share:

Notes on passing Salesforce Certified Sharing and Visibility Designer

I have cleared Salesforce Sharing and Visibility Designer certification on Jan 11th, 2019 and it helped me to become Salesforce Application Architect.

Let me quickly share the Exam Outline:
  • Total Number of Questions: 60 multiple-choice/multiple-select questions.
  • Time: 120 minutes
  • Passing Score: 68%
  • Registration Fee: USD 400; Retake Fee: USD 200
  • Prerequisite: None
In this blog post, I will share my notes and experience during the preparation and also during the exam. I hope it will help you in your #JourneyToCTA.

To me questions were very straight forward, but very descriptive, which took a lot of time to go through the entire question. Going through the entire question is very important because one single work can totally change your answer. 

Before I start preparing myself, I have gone through the below blog posts which helped me to create a consolidated list which I am going to share here.
Below are the topics from where I have received questions:

Understanding Profile and Permission Difference

  • Profile is user’s base level permission and all users having the same profile will have the same permission. 
  • Permission Set is assigned to individual users on top of profiles to extend their visibility.
  • You can set Login Ip, Hour, Session Settings, Password policies in Profiles, where these are not possible in permission sets.
  • Profiles are having hidden permission sets.
  • You can set default apps in Profiles, whereas setting default app is not possible in Permission Sets. You can provide app access to both Profiles and Permission Sets.

Difference Between Login Hour and Trusted IP

  • Login IP is set at the profile level. Use case: You want your internal employees will be allowed to login to your org only from corporate network. Anybody trying to login from outside will not be allowed to login.
  • Trusted IP is set at the Network Access / Org level. Anybody trying to login from the defined IP range, will not be asked to verify their identity. Otherwise, they need to verify their identity either through mobile authenticator or through email code.



Usage of System.runAs()

  • It is only applicable in test methods.
  • Since Apex always runs in System mode, user’s sharing settings is not enforced. That is why we need to use System.runAs() to change the user context and then that user’s sharing settings will  be enforced.
  • runAs() method doesn’t enforce user permission or field level permission. It only enforce record sharing.
  • runAs() ignores user licence limits means in test class you can still create users with runAs() even though you don’t have license in your organization.
  • runAs() will allow you to get rid of Mixed DML exception in Test Class.

Sharing Questions:

Sharing for Communities:


Enterprise Territory Management:


Identify Security threats and mitigation approaches:

  • SOQL Injection
  • XSS

Account Team:

  • Account team shares role with Opportunity Team. So removing account team role will eventually remove the role from Opportunity Team as well.
  • Account owner and users above the account owner in the role hierarchy can add, edit, and delete team members.
  • To add account team member, you just need edit access to the account.
  • To edit/delete team members, you have to be -
    • Account owner
    • Above the owner in the role hierarchy
    • Any user who is having full access to the account
    • And administrator
  • Access Levels for Account teams:
    • Only account owners and users above the account owner in the role hierarchy can:
      • Add team members who don’t have even read permission to the account record.
      • Grant team member some access which is higher than account owd. Note - You can only grant greater access, but you will never be able to restrict access.
  • Disabling Account Team:
    • Disabling account team removes the team from all the accounts and also deletes user’s default account team.
  • Removing Account Team Members
    • Removing one user from the account team will not remove the user from opportunity team
    • If a user in your default account team and you remove the user from one account team, then it will impact only that account, not your default account team.
  • Default Account Team
    • This is default account team for each users. User can select their default account team by going to the advanced settings.
    • While defining default account team, you have the option to apply the default account team to all your open accounts.
    • Clicking on “Add Default Team” from the account page layout’s related list will add the default team of the account owner, not the person who is clicking the button. Only Admin and users above the account owner in role hierarchy can add default team in the account.
    • The access level can be set to the same or wider than your owd access.

Other Topics:

  • Encryption in rest and transit
  • Usage of Protected Custom Metadata, Protected Custom Settings, Crypto Class.
  • Apex Managed Sharing and reason to avoid deletion of share record in case of record owner change.
  • How reports, dashboards and folders are shared.
  • List view accessibility.

Recommended Reading:

Share:

Sharing Options and User Licenses in Salesforce Communities

While implementing Salesforce Community, identifying the record access requirements is an important steps which we all should do before procuring user licenses or setting up the communities. The reasons why I am telling this are -
  • Sharing options in Communities depends on the type of Community User License (Customer or Partner)
  • Even with the most open user license (Partner), there are few "gotchas" when it comes to sharing in a Community.
  • You need to adjust internal sharing settings to make sure you are not giving unwanted record access to your community users.

License Types

Salesforce has a great chart here which compares features between Customer and Partner user license. But I prefer the below picture while deciding the license types.
In short, Customer licenses are designed for high-volume applications with any complex sharing requirements. Customer licenses are not having any roles. That is why sharing rules, Apex sharing and manual sharing are not available for Customer licenses.

On the other hand, Partner licenses are having access to more object types. For example, if you want community users should have access to Leads, Opportunities, Campaigns, upload contents then you need Partner license. Partner licenses are having roles so sharing options are available.

In addition to the above two licenses, Salesforce has Customer Plus license which is kind of middle between Customer and Partner license. So if your requirement is that you want your customers to have full access to Accounts, view access to Contents, ability to create Tasks, view access to Reports and Dashboards, and role-based sharing, then you should got for Customer Plus license.
So the difference between Customer Plus license and Partner license is that users with Partner license can access "premium" standard objects Leads, Campaigns, Opportunities.

Sharing Options with Customer License:

We basically have two options here: Sharing Sets and Share Groups. So let's explore both with some use cases so that it will become easier to understand.

Sharing Sets:

Sharing Sets will allow you to grant a external user access to records based on relationship with the user's contact or account (or a contact or account related indirectly to the user through some lookup relationship).
Use Case: Requirement is to share all cases created under the same account to all users in the same community.

Share Groups:

Share Groups allow to share records owned by community users with internal users. Basically you can use Share Groups to share records owned by an External user (with a Customer Community or High-Volume Customer Portal License) with Internal users, partner users, or other High-Volume external users in the same account). 
Use Case: Requirement is to share cases created by external community users with Call Center Reps (Internal users). (Account restriction applies to High-volume external users only).

Important Point to Remember:

  • Sharing Sets:   External User   ->   External User
  • Sharing Group:   External User   ->   Internal User

Sharing Options with Partner License/Customer Community Plus License:

With Partner license, you have five options - Role Hierarchy, Super User Access, Sharing Rules, Manual Sharing, Apex Sharing.

Role Hierarchy:

Each partner account can have 3 roles (Executive, Manager and User). Using record ownership and role hierarchy is the simplest way to share records among Partner users in the same account.
Use Case: Requirement is to allow some partner users to see only those records which they create, whereas for other partner users they should be able to see records created by others below them in role hierarchy.

Super User Access:

Partners with Super User access will be able to see records created by other users in their account at the same level or lower in the role hierarchy, for Cases, Leads, Opportunities and Custom objects only. For Customer Plus users, this can be given through permission sets.

Sharing Rules:

Owner and Criteria based sharing rules can be used to share records within Partner community. You can use Partner Role and public groups in these rules.
Use Case: Requirement is to share all Opportunities related to a particular partner account with all users in the partner account, but don't want to open up the full super user access. Here you can create a criteria-based sharing rule where the AccountId is the partner account and then sharing with partner account executive role and subordinates. 

Manual Sharing:

External users with Customer Community Plus and Partner License can use manual sharing but only on VF Communities. It's in the Salesforce roadmap to add support for lightning communities. Another mechanism for manual sharing is Opportunity team i.e. a reseller shares the opportunity with his SI (co-seller use case).
Use Case: Partners work closely with internal users on few opportunities.

Apex Sharing:

Apex sharing should be used when the sharing requirements are too complex which cannot be implemented with criteria-based sharing rule. Basically this is the last resort you have.

Recommended Reading:

Recent Changes:

Share:

Salesforce Enterprise Territory Management Cheat Sheet

This post is the continuation of my study notes for  Sharing and Visibility Designer Architect Certification. Previous post was regarding Salesforce Sharing and Security Cheat Sheet. Enterprise Territory Management is a very important topic and having a clear understanding will definitely going to help in passing the certification as well as implementing it for your own project.

Important Note:

  • Original Territory Management is only available with Customizable Forecast.
  • Enterprise Territory Management works with Collaborative Forecast. It will not work with Customizable Forecast.

Territory:

Group of Accounts and Sales reps who work for those accounts.

Territory Type:

This is the criteria to group territories. Every territory must have one Territory Type, but it will never appear in the Territory Hierarchy

Territory Type Priority:

Helps you to create priorities for your territory type.

Territory Model:

  • Creates the entire Territory Hierarchy.
  • It allows to create multiple territory hierarchy and test that before activating.
  • Number of territory models depends on the Salesforce edition.

Territory Hierarchy:

  • Shows the model's territory structure.
  • You can run assignment rules at the model level or individual territory levels.
  • Your territory hierarchy in active territory model also determines the forecast hierarchy for territory forecast.

Territory Model State:

  • Three states - Planning, Active or Archive.
  • Only one territory can be in Active state.
  • Multiple territories can be in either Planning or Active state.

User Access for Territory Records:

  • Define Account access in Territory Settings when enabling the Enterprise Territory. You can change it later as well.
  • Account Access is:
    • Users in the territory can view and edit the Accounts in the same territory or
    • Users in the territory can view, edit, transfer and delete the Accounts in the same territory.
  • Contacts, Opportunity and Cases will have the default access defined in Internal Access settings if the access level is either Controller by Parent or Public Read/Write/Transfer.
  • If the Internal Access for Contacts, Opportunities and Cases are configured anything apart from Controller by Parent or Public Read/Write/Transfer, then you can set the access as -
    • View all contacts/cases/opportunities associated with Accounts in the same Territory irrespective of who owns the contact/case/opportunity.
    • View and Edit all contacts/cases/opportunities associated with Accounts in the same Territory irrespective of who owns the contact/case/opportunity.
  • This settings can be changed when creating Territories. You can change it to make it more restrictive (Territory Settings : View and Edit, whereas Territory Hierarchy Settings: View, Edit, Transfer and Delete) as well.
  • Territories access level is inherited by the parent territories above it in the territory hierarchy. Example: India (View and Edit) is the parent of Kolkata (View). Users assigned to India territory will have View access to Accounts assigned in Kolkata territory.

Assigning Territories to Accounts:

  • "Manage Territories" permission is required to assign accounts to territories.
  • Either manually assign accounts or write assignment rules.
  • Assignment rules can be inherited to child territories by selecting the option while creating the assignment rule. If selected, the criteria from the parent territories is not required to be mentioned in the child territories assignment rules.
  • Accounts can be associated with multiple territories.
  • Manually added Accounts will remain in the Territories until and unless it is removed manually.

Assigning Territories to Users:

  • When users moved to a new Territory. they have the option to take their existing Accounts and Opportunities with them,

Assigning a Territory to an Opportunity:

  • From the opportunity detail page, select the territory.
  • You will only get those territories where -
    • Both the opportunity owner and opportunity's account owner are present,
    • you have administrative access and also associated with opportunity's account.
    • you have administrative access that are above the opportunity's account in the territory hierarchy.

Filter based Opportunity Territory assignment:

Assigning Territory Roles to Territory Users:

  • You can define custom roles under User Territory Assignment -> Role in Territory.

Optimize Performance:

  • Always select inherited rules to child territories which will prevent rule engine to evaluate more territories and thus improving performance.
  • Always start with the lowest level of territory hierarchy and then move upwards. With this approach, it will not recalculate Account, Contact, Opportunity, Case access for the same territories.
  • Always define criteria on Numeric fields, rather than String field while creating assignment rules.
  • Keep the assignment rule restrictive by avoiding lots of OR condition.
  • More than 10,000 records associated with single territory will always create performance issues.
  • For best performance, single user should not be liked with more than 3 territories.
  • If needed more users (more than 1,500 users) in a single territory, better to use user-to-territory assignment through API.
  • You should not run assignment rule for each Account update. You can eliminate that by not selecting the option evaluate this account against territory rules on save. The reason is even though you are editing single account, but the assignment rule will run for all the accounts, which can cause performance issues.

Difference between Role Hierarchy and Territory Hierarchy:

  • Role Hierarchy is perfect for managing organization structure where one person reports to only one person.
  • Territory Hierarchy is perfect for managing matrix reporting structure where one person reports to multiple person.

When to use what? Role Hierarchy or Territory Hierarchy:

  • You should use Role hierarchy to use implement your organization hierarchy, reporting rollups, approvals.
  • Then use Territory hierarchy to extend access to records based on user's territory assignment.

Forecast Manager:

  • To see the rolled-up forecast, assign Forecast manager to parent territory.
  • Forecast manager can view and adjust forecasts.
  • Without Forecast manager,  users can view and adjust only their own forecasts, but can't adjust other's forecast.
Please let me know if you think I should add something here in the comment section.
Share:

Salesforce Sharing and Security Cheat Sheet


"Sharing is Caring", right?? That's the attitude I like most about Salesforce Ohana. As I am preparing myself for Sharing and Visibility Designer Architect certification, I thought of sharing some of my study notes regarding Salesforce Sharing and Security.

Security is the main pillar of Salesforce eco system and it is complex. It will give you fine-grained control over data access. So it requires a very good understanding of the concepts to implement in correctly.

I will suggest everyone to go through these below articles to understand it clearly.
I am not going to write everything what is written in these documents, rather I would like to provide a concise, sharp cheat sheet which you can refer anytime. So let's start -

Sharing Metadata Objects/Records:

  • For standard object -> "Object[Share]"
  • For custom object -> "Object__[Share]"
  • Contains three types of sharing -> managed sharing, User managed sharing and Apex managed sharing
  • Fields present in the share object - access level, record ID, user or group ID
  • Share records are not created for OWDs, role hierarchies, or the "View All"/"Modify All"/"View All Data"/"Modify All Data" permissions.
  • If the owner of the record changes, sharing record with reason "Manual" will also be deleted.

Implicit Sharing:

  • This is applicable only for Accounts, Contacts, Cases and Opportunities.
  • Access to parent record - If you have access to one of the child record, you will have Read Only  access to the parent record.
  • Access to child record - If you have access to parent record, you will have access to all child records(Contacts, Cases and Opportunities). 

Organization Wide Defaults (OWD):

  • Grant access using hierarchies is enabled by default for standard objects (You cannot disable the same). For custom objects, you can enable/disable this property.
  • Can't be changed for contacts if person accounts are enabled.

Master Detail:

  • Access is controlled by parent record.
  • Child record will not have any share record of their own.
  • It is not possible to write sharing rule for child object.
  • Only parents in the M:D relationship will have the owner.
  • If the detail object is having more than one master record, then first M:D created will become the primary relationship.

Lookup:

  • Child object can have their own sharing access level and ownership.

Manual Sharing:

  • Removed when owner changes.
  • Removed when OWD becomes at least as permissive as share.
  • Private contacts (without Accounts) cannot be manually shared.

Apex Managed Sharing:

  • Using Apex code to share the record.
  • Requires "Modify All" permission.

Ownership-based Sharing Rules:

  • When you want to share records owned by user, group, queue or role with another user, group, queue or role (including portal users with role).

Criteria-based Sharing Rules:

  • When you want to share records based on values of a specific field or fields with another user, group, queue or role (including portal users with role).

Manual Sharing Rules:

  • When the record owner or someone with "Modify All" permission wants to share individual record with another user, group, queue or role (including portal users with role).

Share Group:

  • You want to share records owned by HVP users with internal users, groups or roles (includes portals users with roles)

Sharing Sets:

  • You want to share records with HVP users. Records should fulfill the below criteria:
    • Object's OWD is different than Public Read/Write.
    • Object is available for Customer Portal.
    • Custom object is having a lookup field to account or contact.

Portal - High Volume Portals (Service Cloud Portals):

  • Include High Volume Customer Portal and Authenticated Website profiles. 
  • They have no roles and can’t participate in “regular” sharing rules.
  • You can share their data with internal users through Share Groups.
  • You can share object records where the object is a child record of the HVP user’s contact or account. This is done with Sharing Sets.
  • They can also access records that are:
    • Available for portals
    • Public R/W OWD or
    • Private OWD and They own the record.
  • They can access a record if they have access to that record’s parent and the OWD is set to “Controlled by parent”.
  • Cases cannot be transferred from non-HVP to HVP users

Large Data Volumes:

  • Defer sharing settings (enabled by logging a case) and group calculation on large data loads and modifications.
If there is anything you think I should put in this list, please mention the same in comment. I will be more than happy to put the same here.

I hope this cheat sheet will give you a very good summary of Salesforce Sharing.


Share:

Happy New Year and Keep Learning


Once again, the start of a brand new year has come upon us. As we enter into new possibilities, may we all be reminded that we have the ability to be, do, and have anything that we want; that there are no mistakes, only lessons; and that the love and happiness we seek is already within our grasp.  It’s easy to make resolutions and renew our commitments.

As we begin 2019, my prayer is that we continue to grow and find the space within ourselves to know, beyond all doubt, that there is nothing more that we need to do in order to be complete. We don’t need a new exercise plan, more money, a better job, a new car or a bigger house. All we need is a willingness to allow ourselves to feel good and to be at peace in the present moment. All we need is gratitude for all that we have, and all that we have had the pleasure to be and to experience. That is the starting point from which all other things will flow into our existence.
Thank you for the wonderful support that you have given me through the past year! Wishing you a wonderful new year!
2018 was great journey for me both professionally and personally. I would like to share some really important moments -
  • I left Cognizant and joined Appirio Inc., a Wipro company. Leaving Cognizant was really difficult for me, because Cognizant gave me all kind of supports during my Salesforce journey. So Cognizant will always remain special. But Appirio is a company I was always dreaming to be part of. Journey with Appirio is awesome. I met so many great colleagues who are not only great in Salesforce, but more that that, they are great human being. I am enjoying every bit of my Appirio journey.
  • I was feeling so bad leaving my Manulife team and I am still missing the team. I met the greatest team ever in Manulife. 
  • I went to Dreamforce'18. It was HUGEEEEEEE... Again thank you Appirio for giving me the opportunity to be part of Dreamforce.
  • I became leader of Kitchener, CA Developer Group and thank you to Salesforce for giving me the option to contribute to our Salesforce Ohana.
Events from Kitchener, CA Developer Group:
Share:

SalesforceDX : Explaining Scratch Org Definition File


Scratch Org definition file is getting used to create the shape of your scratch org. I would say it is the blueprint of your scratch org. You can use this definition file to create multiple scratch org from your repository.


Scratch org definitions come from JSON text files that are stored in your project's repository and directory structure. When an SFDX project is first created, it comes with a config/project-scratch-def.json file that defines an extremely basic org "shape" for an empty scratch org.
That default scratch org likely looks nothing like your production org. You can use it for developing functionality that isn't dependent on your org's settings, or you can customize it using the settings that are available as part of the configuration file, or you can script your process to perform Metadata API deploys or other API actions to control settings that DX does not support yet.
Ideally, the combination of your DX source code (including all your programmatic and declarative customization) with your scratch org definition gets you close enough to Prod instance.

This definition file contains three main important information about your scratch org.
  • Which Edition? As of Winter'19, it supports Developer, Enterprise, Group or Professional
  • Add-on features: Functionalities you want to include while creating the scratch org like communities, StateAndCountryPicklist, LiveAgent etc.
  • Settings: Org and Feature settings used to configure Salesforce products, such as nameSettings, ideaSettings, caseSettings, omniChannelSettings.
Let's dig into a Scratch Org definition file now -

{
    "orgName": "Sudipta Deb Company",
    "username": "[email protected]",
    "adminEmail": "[email protected]",
    "description": "This is the scratch org created by Sudipta Deb",
    "edition": "Enterprise",
    "features": ["Communities", "StateAndCountryPicklist", "LiveAgent"],
    "settings": {
        "orgPreferenceSettings": {
            "s1DesktopEnabled": true,
            "networksEnabled": true,
            "chatterEnabled": true
        },
        "nameSettings": {
            "enableMiddleName": true,
            "enableNameSuffix": true
        },
        "quoteSettings": {
            "enableQuote": true
        },
        "liveAgentSettings": {
            "enableLiveAgent": true
        },
        "omniChannelSettings": {
            "enableOmniChannel": true
        },
        "ideasSettings": {
            "enableIdeas": true
        },
        "caseSettings": {
            "emailToCase": true
        }
    }
}

Now let me explain different parts of this definition file -
  • orgName:  It is just giving a name of your organization in the scratch org. 
  • username: username of the scratch org user
  • adminEmail: Email address of the Dev Hub user making the scratch org creation request.
  • edition: provides the Salesforce edition of the scratch org.
  • description: Giving description of the scratch org. It's a good practice to provide description.
  • features: In my example, I am enabling communities, StateAndCountryPicklist, LiveAgent in the scratch org.
Share:

Action Plan in Financial Services Cloud || Winter '19 New Feature

In Winter '19 release, Salesforce introduced Action Plans for Financial Services Cloud. It captures repeatable tasks in templates and then automate the task sequences with an action plan.
Example: Processing Loan application, Customer on-boarding process etc. It will also give you the option to create reports and dashboards to monitor progress and ensure compliance.

It consists of three parts -
Action Plan Template: Power consistent customer experiences with configurable task templates.
Process Automation: Increase productivity by automatically generating tasks with due dates and role based assignment.
Plan Execution: Drive collaboration and complaint task completion with analytics and enforcement of required tasks.

Let's explain in details -

Action Plan Template

An action plan template is nothing but a list of tasks to complete a business process. In a template, each task is given a priority, the deadlines (the number of days in which it should be completed - data offset), and who is responsible. Then this action plan template is used to create action plans with each task assigned to a user with a completion date.

Below picture will give you a great view of Action Plan Template and Action Plan -

Now let's start creating one Action Plan:

Pre-requisite

  • Permission Set: You need to assign permission set - ActionPlans to the users. Without this permission set, you will not be able to assign action plan task to those users.
  • Extra Permission: You can provide below standard object permission so that users can edit and delete action plans-
    • Action Plan: Read, Create, Edit and Delete.
    • Action Plan Template: Read, Create, Edit, Delete and View All
  • Status Field Required: This is required to accurately track and report on action plans based on their status. Set the Action Plan Status as mandatory field in Action Plan layout.
  • Action Plan List to Account  Page Layout: Add action plan related list in Account Page layout.
  • Action Plan Lightning Component: Add the Action Plans List - Financial Services Cloud Lightning Component in the page in a separate tab.
  • Setup Nonwork days: Use this option to skip nonwork days when setting up the task completion dates. To do that, you can set the Business Hours and setup company-wide holidays.


Use Case

We will use Action Plan Template to automate new credit card opening processes for financial institute XYZ and then use the template to create the action plan for one of the account. 


Action Plan Template

Let's start by creating the action template and inside the action template below are the tasks -

Against each task, we have the option of whom to assign the task - we have three options (Action Plan creators, any other user, or the account team member role). We can define the number of days to complete the task and priority. Here is the view -

Finally we can publish the action plan template.


Action Plan

Now with action plan template published, we can login to any account and create the new plan using action plan template. Here is the action plan creation for - XYZ Visa Credit Card 


What happened at the backend, Salesforce has created all the tasks and assigned to owners based on the task configuration. We can see the same from account's task view.

Considerations




Share:

Follow Me

Enter your email address:

Delivered by FeedBurner

Labels

Salesforce (105) Apex (47) admin (27) visualforce (21) ADM (20) dev 501 (19) integration (18) learn salesforce (18) 501 (16) lightning (15) SOAP (13) javascript (13) tutorial (11) Certification. (10) Kitchener Developer Group (8) Certification (7) Trigger (7) security (7) test class (7) unit testing (7) Advanced Admin (6) Advanced Apex (6) Sharing and Visibility (6) design pattern (6) developer (6) report (6) salesforce release (6) service cloud (6) trailhead (6) Lightning Experience (5) New Features (5) SOQL (5) css (5) dashboard (5) debug (5) formula (5) mobile (5) solution management (5) use case (5) JSON (4) Kitchener User Group (4) Lightning Web Component (4) Sales Cloud (4) Salesforce DX (4) Tips (4) WebSphere (4) best practice (4) cast iron (4) component (4) deployment (4) event (4) github (4) html (4) polymer (4) profiles (4) responsive (4) tdd (4) ui (4) Architect (3) Live Chat (3) Online Event (3) Opportunity (3) Performance (3) Products (3) REST (3) Role (3) Salesforce Certification (3) Scratch Org (3) Study Notes. (3) Summer15 (3) Web Technology (3) automation tool (3) dynamic apex (3) license (3) map (3) mapbox (3) release (3) singleton (3) version controlling (3) visual studio code (3) Asynchronous callout (2) Aura Framework (2) Bulkify (2) Community (2) Data Architecture and Management Certification (2) Devops (2) Distributed Version Controlling (2) ES6 (2) Eclipse (2) Einstein (2) Enterprise Territory Management (2) Financial Services Cloud (2) Force.com IDE (2) Governor Limit (2) Groups (2) IBM (2) Implicit Sharing (2) JourneyToCTA (2) Lightning Design System (2) Lightning Feature (2) Live Agent (2) Metadata (2) PD II (2) Price Book (2) SOSL (2) Sharing (2) Spring 15 (2) Summer17 (2) Territory (2) Virtual Event (2) ant (2) basic (2) chatter (2) coding (2) communication (2) configuration (2) console (2) controller (2) documentation (2) dreamforce (2) flow (2) git (2) jquery (2) logging (2) object (2) permission (2) process builder (2) salesforce1 (2) strategy (2) xml (2) Action Plan (1) Action Plan Template (1) Activity Timeline (1) Advanced Currency (1) Agent Productivity (1) Analytics (1) Apex Sharing (1) AppExchange (1) Arrow (1) Article (1) Asynchronous Apex (1) Batch (1) Bots (1) Browser (1) Bulk data load (1) CTA (1) Calendar (1) Canon (1) Case Management (1) Celebration (1) Cheat Sheet (1) Classic (1) Compare (1) Confetti (1) Constructor (1) Contact Center (1) Continuation (1) Continuous Integration (1) Convert (1) Cookie (1) CumulusCI (1) Custom Metadata (1) Custom Object (1) Custom Permission (1) Customer (1) Dated Exchange Rate (1) Decorator Design Pattern (1) Dev Hub (1) Development (1) Diwali (1) EDA (1) ESLint (1) Education Cloud (1) Email (1) FSC (1) Function (1) Future (1) Global Gathering (1) Goals (1) Guest Access (1) Guest Profile (1) Guest User Sharing Rule (1) Guide (1) HEDA (1) Higher Education (1) Household (1) Husky (1) IDE (1) Ideas (1) Improvement (1) KPIs (1) Knowledge Management (1) LWC (1) Large Data Volume (1) LastModifiedDate (1) Manage Currencies (1) Manual Sharing (1) Metrics (1) Multi Currency (1) New (1) New Feature (1) OOPS (1) OWD (1) Omni-Channel (1) Partner (1) Permission Set (1) Person Account (1) Photo (1) Pipeline (1) Platform Developer I (1) Platform Developer II (1) Presentation (1) Prettier (1) Product Schedule (1) Profile (1) Promise (1) Prototype (1) Public Site (1) Query Plan (1) Queueable (1) QuickReference (1) Related records (1) Reports (1) Retrieve (1) Role Hierarchy (1) SAL (1) SFDX (1) Salesfor (1) Salesforce Advisor Link (1) Salesforce Labs (1) Salesforce Optimizer (1) SalesforceDx (1) Schedule (1) Session (1) Sharing Rule (1) Sharing Sets (1) Site (1) Skills (1) Snap-ins (1) Spring 17 (1) Spring 20 (1) Summer14 (1) Summer16 (1) Summer19 (1) Switch (1) SystemModStamp (1) Timeline (1) Unauthorized Access (1) User License (1) Users (1) VS Code (1) Validation Rule (1) Webservice (1) Winter'15 (1) Winter'17 (1) access (1) actionFunction (1) actionPoller (1) actionRegion (1) actionSupport (1) agile (1) app (1) approval process (1) aura (1) awesome (1) backup (1) bitbucket (1) book (1) campaign (1) change set (1) code (1) code coverage (1) csv (1) custom button (1) custom settings (1) customization (1) data loader (1) database (1) delegate Admin (1) describe (1) dom (1) duplicate (1) dynamic (1) equals (1) error (1) field-level security (1) folder (1) ftp (1) generic (1) gift (1) global describe (1) hashcode (1) import wizard (1) jenkins (1) keynote (1) long running requests (1) monitoring (1) mysql (1) page layout (1) personal (1) power of one (1) record type (1) relationship (1) request (1) review (1) sub-tab (1) tab (1) username (1) visual workflow (1) workflow (1)

Popular Posts

Total Subscribers

Total Pageviews

Contact Me

Name

Email *

Message *