A blog dedicated to Salesforce Ohana

Summer'19 : Celebrate Sales Milestones with Path


In Summer 19 release, Salesforce introduces a new cool feature so that you can let your user celebrate when they reach certain stages in Sales path(or any path). This is a fun, visual way of celebrating success right from the Salesforce screen.

This idea came from an old blog post regarding building with path based component, where community liked the idea and Salesforce delivered this to us now. To me this is the power of Salesforce community.

So let's configure this together -

Step 1

Enable path in your org.



Step 2

Click on New Path. Choose values as shown in the below screenshot. (You can select any values available).

Step 3

Click on Next and ant the next screen select Key fields for the Opportunity Stages. Click on Next.

Step 4

At this stage, enable on-screen confetti.

Step 5

Here, you can select which stage you want top celebrate. Select those picklist values. Also you can select the frequency of celebration. 
And finally click on Finish. That's all you need to do to get this new cool feature.

Here is the video with step by step instructions -


Share:

Kitchener Canada Developer Group Event: Introduction to DevOps with Salesforce DX by René Winklmayer


Special thanks to our speaker, René Winklmayer, for the session on Introduction to DevOps with Salesforce DX.
Here comes the presentation and recording.

Presentation:

Recording:



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

Understanding JavaScript Promises


Introduction to Promises

Dealing with asynchronous code? Promises is the way to deal with it without writing multiple callbacks. Promises were standardized and introduced in ES2015, but in ES2017 they have been superseded by async function. Understanding of Promises is the foundation of learning Async functions.

Way Promises work

Once a promise has been called, it always start with Pending state. At this point, caller function waits for the promise function to finish it's job and then return either in Resolved or Rejected state. But as we know Javascript executes in asynchronous mode, so caller function will still continue doing it's job in parallel with promise doing it's job.

Creating Promises

The Promise API exposes a constructor which you can use to create Promise -

const printSomething = (isValid) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (isValid) {
        console.log('Yes I am valid');
        resolve();
      } else {
        console.log('Sorry I am invalid');
      }
    }, 1000);
  });
}

Here promise is checking a the passed Boolean value isValid. If the isValid is true, then promise is returning resolved promise , other returning rejected promise.

Promise provides resolve and reject to return values to the calling function in case of success or error respectively.

Consuming Promises

Let's now consume the promise with below code -

const printSomething = (isValid) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (isValid) {
        console.log('Yes I am valid');
        resolve();
      } else {
        console.log('Sorry I am invalid');
      }
    }, 1000);
  });
}

printSomething(true)
  .then(() => printSomething(true))
  .then(() => printSomething(false));

Here I am calling printSomething function which is returning Promise either in Resolve or Reject state based on the function parameter isValid.

Here is the outcome -
Yes I am valid
Yes I am valid
Sorry I am invalid

You can execute the code here.


Chaining Promises

You can chain promises by returning result from one promise and then using the same in the next promise.

const printSomething = (name, textToAdd) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      var retValue = '';
      if (name != null) {
        retValue = name + ' ' + textToAdd;
      } else {
        retValue = textToAdd;
      }
      console.log(retValue);
      resolve(retValue);
    }, 1000);
  });
}

printSomething(null, 'Hello')
  .then((result) => printSomething(result, 'Sudipta'))
  .then((result) => printSomething(result, 'Deb'));

As you can see in the above example, I am using the result from the first promise which is "Hello" and the using the same in the second promise to append "Sudipta" with "Hello", thus returning "Hello Sudipta". Finally using this in the third promise to append "Deb", this returning "Hello Sudipta Deb"

Here is the result
Hello
Hello Sudipta
Hello Sudipta Deb

You can execute the code here.


Handling Errors

Handling error can be done by either returning Promise is reject mode or throwing an error.
Let's understand the below example with Reject returning an error.

const printSomething = (name, textToAdd) => {
  return new Promise((resolve, reject) => {
    try {
      setTimeout(() => {
        if (textToAdd == null) {
          reject(new Error('textToAdd can not be null'));
        } else {
          var retValue = '';
          if (name != null) {
            retValue = name + ' ' + textToAdd;
          } else {
            retValue = textToAdd;
          }
          console.log(retValue);
          resolve(retValue);
        }
      }, 1000);
    } catch (e) {
      reject(e);
    }
  });
}

printSomething(null, 'Hello')
  .then((result) => printSomething(result, 'Sudipta'))
  .then((result) => printSomething(result, 'Deb'))
  .then((result) => printSomething(result, null))
  .then((result) => printSomething(result, 'From Canada'))
  .catch(err => console.log('Error occured: ' + err.message));

In the above example, I am returning Reject promise with new Error. Then using the same with catch statement while consuming the Promise. Here is the output -

Hello
Hello Sudipta
Hello Sudipta Deb
Error occured: textToAdd can not be null

You can execute the code here.
Now let's modify the same example, where instead of returning Reject promise, I will throw the error. This is helpful to handle runtime error.
const printSomething = (name, textToAdd) => {
  return new Promise((resolve, reject) => {
    try {
      setTimeout(() => {
        if (textToAdd == null) {
          throw "textToAdd can not be null";
        } else {
          var retValue = '';
          if (name != null) {
            retValue = name + ' ' + textToAdd;
          } else {
            retValue = textToAdd;
          }
          console.log(retValue);
          resolve(retValue);
        }
      }, 1000);
    } catch (e) {
      reject(e);
    }
  });
}

printSomething(null, 'Hello')
  .then((result) => printSomething(result, 'Sudipta'))
  .then((result) => printSomething(result, 'Deb'))
  .then((result) => printSomething(result, null))
  .then((result) => printSomething(result, 'From Canada'))
  .catch(err => console.log('Error occured: ' + err.message));

One important fact is that reject DOES NOT terminate control flow like a return statement does. In contrast throw does terminate control flow.

Let's have the below code with reject

const printSomething = (name, textToAdd) => {
  return new Promise((resolve, reject) => {
    try {
      setTimeout(() => {
        if (textToAdd == null) {
          reject(new Error('textToAdd can not be null'));
        } else {
          var retValue = '';
          if (name != null) {
            retValue = name + ' ' + textToAdd;
          } else {
            retValue = textToAdd;
          }
          console.log(retValue);
          resolve(retValue);
        }
      }, 1000);
    } catch (e) {
      reject(e);
    }
  });
}

printSomething(null, 'Hello')
  .then((result) => printSomething(result, 'Sudipta'))
  .then((result) => printSomething(result, 'Deb'))
  .then((result) => printSomething(result, null))
  .then((result) => printSomething(result, 'From Canada'))
  .catch(err => console.log('Error occured: ' + err.message))
  .then(() => console.log('I will still execute even after the error'));

Output:
"Hello"
"Hello Sudipta"
"Hello Sudipta Deb"
"Error occured: textToAdd can not be null"
"I will still execute even after the error"

You can execute the code here. Here you can see that catch and then statement are getting executed even after reject promise return.

Now let's have the same code with throw statement

const printSomething = (name, textToAdd) => {
  return new Promise((resolve, reject) => {
    try {
      setTimeout(() => {
        if (textToAdd == null) {
          throw "textToAdd can not be null";
        } else {
          var retValue = '';
          if (name != null) {
            retValue = name + ' ' + textToAdd;
          } else {
            retValue = textToAdd;
          }
          console.log(retValue);
          resolve(retValue);
        }
      }, 1000);
    } catch (e) {
      reject(e);
    }
  });
}

printSomething(null, 'Hello')
  .then((result) => printSomething(result, 'Sudipta'))
  .then((result) => printSomething(result, 'Deb'))
  .then((result) => printSomething(result, null))
  .then((result) => printSomething(result, 'From Canada'))
  .catch(err => console.log('Error occured: ' + err.message))
  .then(() => console.log('I will still execute even after the error'));

Output:

"Hello"
"Hello Sudipta"
"Hello Sudipta Deb"
"Uncaught textToAdd can not be null (line 6)"

You can execute the code here. You see this time the catch and then statements are not getting executed. The reason is that throw statement terminate the control flow.


Promise.all()

Promise.all() will return a promise when all the promises are resolved. If one of the promise is failed, it will reject immediately with the error message from the failed promise irrespective of whether other promises are resolved or not.

Let's have this below example: 

var returnDouble = (value) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (value > 0) {
        resolve(value * 2);
      } else {
        reject(resolve);
      }
    }, 1000);
  });
};

var promisesToMake = [returnDouble(20), returnDouble(10), returnDouble(5)];
var finalPromise = Promise.all(promisesToMake);

finalPromise.then(function (results) {
  console.log('Final Result: ' + results);
});

Output:
"Final Result: 40,20,10"
You can execute the code here. With promise.all(), instead of three different returns, it will return one single promise once all the promises are resolved.

Now let's forcefully reject one promise in the below example -

var returnDouble = (value) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (value > 0) {
        resolve(value * 2);
      } else {
        reject(resolve);
      }
    }, 1000);
  });
};

var promisesToMake = [returnDouble(20), returnDouble(0), returnDouble(5)];
var finalPromise = Promise.all(promisesToMake);

finalPromise
  .then((results) => console.log('Final Result: ' + results))
  .catch(err => console.log('Error occured'));

Output:
"Error occured"
You can execute the code here. In this example, the second call is failed, even though the first and third call is successful. But still the final result is failure.


Promise.race()

Promise.race() runs as soon as one of the promises you pass to it resolves, and it runs the attached callback just once with the result of the first promise resolved.
Here is the example 

var returnDouble = (value,time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (value > 0) {
        resolve(value * 2);
      } else {
        reject(resolve);
      }
    }, time);
  });
};

var promisesToMake = [returnDouble(20,100), returnDouble(200,50), returnDouble(5,500)];
var finalPromise = Promise.race(promisesToMake);

finalPromise
  .then((results) => console.log('Final Result: ' + results))
  .catch(err => console.log('Error occured'));

Output:
"Final Result: 400"
You can execute the code here.

Further Study




Share:

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:

Follow Me

Enter your email address:

Delivered by FeedBurner

Popular Posts

Labels

Salesforce (105) Apex (44) admin (27) ADM (20) visualforce (20) dev 501 (19) integration (18) learn salesforce (18) 501 (16) SOAP (13) lightning (12) tutorial (11) Certification. (9) javascript (8) Trigger (7) test class (7) unit testing (7) Sharing and Visibility (6) design pattern (6) report (6) salesforce release (6) security (6) trailhead (6) Advanced Admin (5) Certification (5) Kitchener Developer Group (5) New Features (5) SOQL (5) css (5) dashboard (5) debug (5) developer (5) formula (5) mobile (5) service cloud (5) solution management (5) use case (5) JSON (4) Lightning Experience (4) Salesforce DX (4) WebSphere (4) best practice (4) cast iron (4) component (4) deployment (4) github (4) html (4) polymer (4) profiles (4) responsive (4) tdd (4) ui (4) Advanced Apex (3) Architect (3) Live Chat (3) Online Event (3) Opportunity (3) Performance (3) Products (3) Role (3) Sales Cloud (3) Scratch Org (3) Study Notes. (3) Summer15 (3) Tips (3) Web Technology (3) dynamic apex (3) event (3) license (3) map (3) mapbox (3) singleton (3) version controlling (3) Bulkify (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) Kitchener User Group (2) Lightning Design System (2) Live Agent (2) Metadata (2) Price Book (2) REST (2) SOSL (2) Sharing (2) Spring 15 (2) Summer17 (2) Territory (2) ant (2) automation tool (2) basic (2) chatter (2) coding (2) communication (2) console (2) controller (2) documentation (2) flow (2) git (2) jquery (2) logging (2) object (2) permission (2) process builder (2) release (2) salesforce1 (2) strategy (2) xml (2) Action Plan (1) Action Plan Template (1) Agent Productivity (1) Analytics (1) Apex Sharing (1) Arrow (1) Asynchronous callout (1) Aura Framework (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) Community (1) Confetti (1) Constructor (1) Contact Center (1) Continuation (1) Continuous Integration (1) Convert (1) Cookie (1) Custom Metadata (1) Custom Object (1) Customer (1) Decorator Design Pattern (1) Dev Hub (1) Diwali (1) Email (1) FSC (1) Function (1) Goals (1) Guide (1) Household (1) Ideas (1) Improvement (1) KPIs (1) Large Data Volume (1) LastModifiedDate (1) Lightning Web Component (1) Manual Sharing (1) Metrics (1) New (1) New Feature (1) OOPS (1) OWD (1) Omni-Channel (1) Partner (1) Person Account (1) Photo (1) Pipeline (1) Platform Developer I (1) Presentation (1) Product Schedule (1) Profile (1) Promise (1) Prototype (1) Public Site (1) Query Plan (1) QuickReference (1) Reports (1) Retrieve (1) Role Hierarchy (1) SFDX (1) Salesforce Optimizer (1) Session (1) Sharing Rule (1) Sharing Sets (1) Site (1) Skills (1) Snap-ins (1) Spring 17 (1) Summer14 (1) Summer16 (1) Summer19 (1) Switch (1) SystemModStamp (1) User License (1) Users (1) Webservice (1) Winter'15 (1) Winter'17 (1) access (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) configuration (1) csv (1) custom button (1) custom settings (1) customization (1) data loader (1) database (1) delegate Admin (1) describe (1) dom (1) dreamforce (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)

Total Subscribers

Total Pageviews