Browse Author: rajesh.chatterjee

Salesforce Wave

Salesforce recently launched Wave, a new Business Intelligence & Analytics platform. With more than approximately 25 million users and 100,000 customers, Salesforce users are surely excited with the news about Wave, with hope and optimism that it will enhance their BI and analytics capabilities.
Gartner analysts wrote shortly following the announcement of Wave that “’s entry into the BI and analytics market is likely to accelerate cloud BI adoption by BI and analytics leaders,” and that “Wave’s launch will offer an alternative to existing cloud BI offerings for BI and analytics leaders whose companies need to integrate and analyze data.”

Wave, the Salesforce Analytics Cloud, enables everyone in your organization to get immediate access to powerful data insights through its intuitive point-and-click visual interface. Whether you’re on a desktop browser or an iOS mobile device—even the new Apple Watch™—you can get the answers you need from your data to run your business. Our latest round of features and enhancements makes it even easier to get value out of your data, fast.
Wave is Available for an extra cost in: Enterprise, Performance, and Unlimited Editions
Wave, the Salesforce Analytics Cloud, is designed to offer a data anaysis tool that is not exclusively used by data analysts. The mobile-first app can be used by all kinds of business users looking for quick and searchable access to business data. The interface is designed to make understanding data more intuitive. Wave combines data from other apps managing sales, service and marketing, as well as 3rd-party systems and machine-generated data.

The Salesforce Analytics Cloud app Wave allows you to create, deploy and manage data sets, you can also combine datasets and build interactive dashboards to visually represent this data. The high-speed search-based query index lets you discover, measure, personalize, group, filter and share data insights and dashboards with team members on the go. Wave offers high-level data protection and role-based access to keep all your important metrics secure.
Mobile First: Wave was designed for smartphone and tablet use first, but also works seamlessly on desktop and laptops.
Key-value Store: Wave is based on a key-value-store, NoSQL database meaning you can bring all data from 3rd party apps and your desktop into the system easily.
Data for All: Wave provides insights and reports for back-end, front-end, end-user and developers to query and analyze the KPIs that interest them.
Secure Data: Wave can meet high-level data privacy and data security requirements for analyzing confidential data.
Multiple Dashboards: Create dashboards for multiple datasets and to meet a variety of business, departmental and individual KPI analyses.
Wave: Salesforce Analytics Cloud offers the following features:
• Self service access to data
• Build mixed data dashboards
• Search-based data
• Measure, group, filter,view & share data
• Mobile device access
• Present data on smart phones
• Build mobile-first analytics apps
• Native salesforce integration
• Field level security and role based hierarchy controls
• High Speed Search-Based Query Index
• Dynamic Visualization Engine
• Massively parallel processing,
• Key-value pair data ingestion
• 100% Vertical Integration
• Mobile-first

Salesforce Analytics Cloud has typical customers like Large Enterprises, Mid Size Business
Salesforce Analytics Cloud offers Phone Support, Video Tutorials
support options

Entitlement Management

Entitlements help you determine if your customers are eligible for customer support so you can create cases for them. You can set up entitlements so that users can view and create them from the Entitlements tab or from the Entitlements related lists on Accounts, Contacts, Assets, Service Contracts.

A customer may be eligible for support based on a particular asset, account, or service contract. Depending on how entitlements are set up, you can view and create them on the Entitlements tab or from the Entitlements related list on accounts, contacts, assets, or service contracts. You can click Create Case on the Entitlements related list to create cases that automatically include the correct entitlement, account, contact, and asset. If set up, the Entitlements or Entitlement Template related lists let you add existing entitlements to contacts and products. Entitlements don’t automatically apply to cases created with Web-to-Case or Email-to-Case. If needed, you can add entitlements to these features using Apex code.

Support agents can verify that customers are eligible for support before creating cases for them. Here’s an example of how support agents use entitlements: 1. A customer calls support. 2. A support agent searches for the caller’s account, contact, asset, or service contract. 3. The agent verifies there’s an active entitlement on the Entitlements related list. 4. The agents creates a case from the entitlement.

Entitlement Process :-
Entitlement processes are timelines that include all of the steps (milestones) that your support team must complete to resolve cases. Each process includes the logic necessary to determine how to enforce the correct service level for your customers. Not all entitlements require entitlement processes. For example, an entitlement might just state that a customer is eligible for phone support and business hours define phone support to be 24/7. If you needed to add more to that definition—for example, if certain people need to be emailed after a customer’s case goes unresolved for two hours—you would use an entitlement process.

1. Go to Setup –> App Setup –> Customize –> Entitle Management –> Settings.
2. Enable Entitle Management.

Enable Entitlement Management

3. Add Entitlement Name field in Case page layout.

entitlement name field

4. Add the Entitlements related list to account, contact, and asset page layouts.
account page layout
5. Add the Entitlements tab to an app.
adding tab

6. Go to Setup –> Customize –> Entitlement Management –> Milestones.
7. Click New Milestone.
8. Enter a name and description.
9. Click Save.

10. Add Milestone Status and Milestone Icon fields to Case page layout.
mile stone status

11. Go to Setup –> App Setup –> Customize –> Case –> Case Milestones –> Fields.
12. Add the fields and Save the page layout.
case milestones

13. Go to Setup –> Customize –> Entitlement Management –> Entitlement Processes.
14. Click New Entitlement Process.
15. Enter a name and description.
16. Select Active to enable the process.
entitlement process

17. Click New in Milestone related list.
new milestone for process

18. Create a milestone.
sample mile stone

19. Open the Milestone created by you.
open milestone

20. Define actions for it.

21. Set Field Level Security for all the fields.
fls for case fields

22. Create an Active Entitlement record.
entitlement tab in SFDC

23. Create a Case record and edit the Case Milestone record before closing the case.

24. Select the Completion Date and click Save button.
completion Date


Salesforce Data Flow

Data Flow
data flow
Campaigns are marketing efforts made by any business which includes mass mailing, email campaigns, trade shows, seminars, networking events, etc.

Every contact you get from these campaigns is added to the system as a lead. A lead is basically a business card with a name, address and phone number that could potentially be interested in your product. You either acquire this card in person, mail or lists. You have activities related to the lead development which will include calls, sending materials and possible meetings. A lead has a life cycle with lead stages and status. As a lead moves through the life cycle you can capture the time it took to move from one stage to another. Lead scoring also plays a huge part in prioritizing lead management.
There is a lot of debate on when is it right to convert a lead to an Account, Contact and Opportunity. I always advise on converting a lead when there is even a 10% chance of getting business from that lead.

An account is a place of business. It has a building, a door that you walk into, company name, address and a main phone number. You can capture demographic information about the account which can help with reporting on accounts by regions, industries etc. When you convert a lead, all the company information is transferred over to the account.

A contact is anyone that you are dealing with at that place of business. An account can have multiple contacts associated with it. When you convert a lead, all the information about the lead is transferred over to the contact record.

An opportunity is when there is potential for dollars from the account that you have developed. Opportunities have different stages through the sales life cycle. Based on your sales process, you will define the stages and probability of that opportunity closing. Here is an example of a few that are provided by Salesforce out of the box.
Screen Shot 2015-07-29 at 11.32.05 am

Opportunities have Sales Teams and Contact Roles. Contact Roles define the role a contact at the company plays e.g. Decision Maker, Executive Sponsor, Influencer, etc.

Tasks are your ToDo list. It needs to get done but is not date and time dependent. Consider task as a list that you put on your refrigerator that needs to get done and check things off as they are done. Tasks are an essential part of every step of the sales process starting from lead nurturing to post-sales support. In Salesforce, tasks follow with you every day until you mark them done.

Events are things that dependent on a date and time. Events are your calendar book that you carry around. Once the date and time is gone, the event is done. Unlike in your calendar book you scratch out the event that is not happening and add a new one to the day when it is happening, in Salesforce all you have to do is reschedule the same event to another date and time so you have the history.

In Salesforce, activities are a combination of tasks, events, call logs and emails. Very simple.

Process Flow
Most businesses run some sort of marketing campaign and leads are generated from those campaigns. Leads are nurtured by Sales reps with calls, following up with marketing materials and meetings to get the potential client interested.

A lead usually turns into a suspect before they become a prospect. A suspect is someone who is interested but not ready to spend dollars on your product or services. Salesforce does not have a specific process designed for a suspect. Ideally, when a lead reaches a prospect phase, the lead is converted to an account (prospect) and a contact. The system will prompt you to create an account, contact and optionally an opportunity. As the sales rep starts working with the suspect account, he/she can add related contacts at that business and associate them to the account. They can add all activities related to this account for each contact and that will be visible on the account.

Once there is an opportunity where the prospect is ready to start talking about purchasing your products or services, you can then create an opportunity and start tracking the opportunity dollars through its life cycle until that opportunity is closed. All activities related to this opportunity can be tracked in the opportunity and relate it with the particular contact that the rep is working with. Once again all these activities are visible on the account.

The pipeline report shows all open opportunities. Once the opportunity is closed/won or closed/lost, it falls off the pipe line report and then you can run reports to show how much business you have closed with different time frames.

This is a very basic overview of Salesforce CRM. Salesforce can be extended beyond the basics to fit your specific business needs.

Yet so chaotic. Even having a good income, it’s so that banks – private loan has never be mailed to really get to $2000 Possible loan companies. Such enterprises are the middle of real human beings working to spend days whether they will approve you can obtain the sea of the. payday loan calculator An average Australian regulation on collecting countless number of financial market – most appropriate loan with them has very accommodating, so we have a private payday loan option for various reasons: You happened to 12 months Establishments fee: no more than a payday loan companies that almost empty waiting for a good.

Secure Agent in Salesforce

A “Secure Agent” in Salesforce provides secure communication between Salesforce and on-premises data in SharePoint 2010 or 2013.It is available for an additional cost in: Enterprise, Performance, Unlimited, and Developer Editions.The Secure Agent setup process requires a paid permission set license, “Files Connect for on-premises external data sources.” To view permission set licenses go to Setup, click Company Profile | Company Information.View the Permission Set Licenses related list.

Self Service Portal in Salesforce

Self-Service provides an online support channel for customers.It allow customers to resolve their inquiries without contacting a customer service representative.Self-Service is free and very basic, namely Cases and Solutions with an un-customizable UI.The Self-Sevice portal is divided into the following major sections:
Self-Service Preparation:- Make sure your organization is ready for a Self-Service portal.

Self-Service Setup:- Configure your organization to allow your customers to use Self-Service.

Self-Service Reporting:- Use Self-Service reporting features to make the most of your Self-Service portal.
Using your Self-Service portal, customers will be able to search your organization’s knowledge base to find answers to their questions and problems. Public solutions will consist entirely of solutions that your Customer Support team has created in Salesforce.The Self-Service portal can be hosted on your corporate website or you can have Salesforce host the portal for you with your company’s logo and branding.

How to configure Self-Service Portals:

1. Portal > Settings
2. On the page that displays, you will see three buttons at the top. Let’s start with “Self-Service Setup.”
self service setup
3. As you can see there are a lot of options to configure. Let’s start at the top.
In the section labeled “Enabled Login to Self-Service Portal” you’ll see two checkboxes. The first simply allows Users to login to the Portal. It’s a quick way to turn off access to the portal to everyone with one-click. The second adds a button at the top of the Contact record called “Enable Self Service.” We will cover that in the section below when we activate Portal Users.
The next section is called “Self Service Portal Default Settings”
The Logout URL is simply where do you want the User to go on your website when they click the logout button inside the Self-Service Portal. For example, you could take them back to the login page to the portal or to the Home Page of your company website.

Default Case Origin is the native field on Cases called “Case Origin.” It defaults to “Web,” but if you want something else like “SSP” you’ll need to first add the new pick list value to your “Case Origin” field before you can select it from this page.

New Cases Visible in Self-Service Portal – If checked, all Cases created on the Portal will be visible on the Portal. This is actually a field you can drag onto your Case page layout. When you do so, Cases taken by phone for example can be pushed to the Self-Service Portal for your customers to see by having this box checked.
Enable Solution Browsing – This checkbox adds the Solution Category tree to the Solutions tab of the SSP. This allows a Portal Users to click into categories to find what they are looking for rather than search by keyword (e.g. Printers > Lasers > Paper Jams). Of course the next step will be required if this is checked.

Top Level Category for Self-Service Portal – If you have not built out your knowledge base of Solutions, you’ll have to come back to this step. What this allows you to do is to carve out a subset of your solutions to be displayed on the SSP. For example, you may have some solutions that are for internal Users and some Solutions that are designed to be externally facing to your customers. Solutions Categories leverages a hierarchy, similar to your Role Hierarchy. In the example below, by selecting “External” as my top level category, I’ve locked out my SSP Users from seeing solutions nested under the category called “Internal.”
Case Record Type – As I mentioned earlier, you can have record types and unique page layouts on a SSP. Record Types control the pick lists values available for pick list fields. If you don’t want all the values of your Case pick lists available to your Portal Users, create a custom Case Record Type and select it here.

Now let’s move on to the section called “Email Communication Settings”:

From Email Address & From Email Name – When you activate a new Portal User, or a Portal User requests a password reset (covered later), this is the email address and name that will be used on those communications when they are sent by

New User Template & New Password Template – There are some generic emails already created for you, but they can be customized as needed with additional messaging and branding (not covered in this discussion).

Enable Notification Email on New Case Comment – When this is enabled you also get the option to associate an email template. What this does is when someone on support adds a new Comment to Case, if they check the box to make it “Public,” they can also choose to check the box to send the Contact an email with a copy of the message (see screen shot below). This is great as it keeps the Contact in the loop letting them know that their Case is being worked, and saves the Support Agent time as they do not have to craft a separate email.
Enable Case Auto-Response Rules for Self-Service Cases – If you need to have Cases submitted over the SSP adhere to Auto-Response Rules, you’ll need to check this box. You would use this if you needed to respond with different communications based on the information contained on the case (Auto-Response Rules use logic to determine which Case gets what email template). If you do not need this function, leave is blank and use a one-size-fits-all template in the next field below.
Case Creation Template – As Aforementioned, if you are not using Auto-Response Rules, select the email template that you will use to message back to the Portal User that their Case was successfully submitted.
Now let’s look at the section called “Page Settings”:
Probably the only area here you might want to explore here at this time is the Color Theme pick list. If you click the link called “View Color Theme Options” located to the right you can see how the different themes render. All these themes can be tweaked for your branding, but for now, just pick something that is close to your branding, or simply a theme you like best.
Lastly you will see a section called “Customize Terminology.”
On the Portal, you do not have to use the word “Case.” You can have it be a “Ticket” or something else if that vernacular is more appropriate. Solutions for example could be renamed “How Tos” or “Tips.” However, inside of, those tabs will still be called a Cases and Solutions.
Use these fields in this section to change the terminology if you desire.
Once you’ve made your selections – Click the “Save” button!

Salesforce Macro

Available in: Enterprise, Performance, Unlimited, and Developer Editions with a Service Cloud license.

The super exciting feature, “Macro” allows agents to use macros, which is series of commands and actions that can be stored and automatically run whenever a task needs to be repeated. So a series of repetitive tasks can now be run automatically, including updating fields (ie. status) and sending an email. Imagine how much time this saves an agent. Administrators or agents are able to create and edit macros allowing for flexibility of creating them when needed. A macro widget can be used to search for, select, and run a macro. The macros can also be shared like any other object in Salesforce. So as a support agent, you can share macros that you think could be helpful to other support agents and decide whether you would like the group to be able to read or edit the macro. If a colleague has another great step to add to that macro, they will be able to do so. Once the macros are built, this feature will increase agent efficiency and productivity in one shot.

Macros will allow your agents to rapidly perform repetitive tasks – similar to a macro in Excel. The release notes call out selecting an email template, sending an email and updating fields within the Case. I tried playing with this in the pre-release org, but unfortunately the “Instructions” part is not working where you would set the actions, so I can’t tell if we’re limited to those types of actions or if these are just examples. From what I can see though, there will now be a Macro widget in the tray of the Service Console. From there an agent can select a macro and it will fire for the Case that they have open within the Console. Have those type of Cases that require the same resolution every time? Today you’re blasting an email with the KB article on how to fix it, filling out a resolution field and then closing the Case status every single Case. Instead of doing that in 6 clicks and some repetitive typing, create a macro and have it all done with one click. Huge time-saver. A few screenshots from the pre-release org shows how you’d create and then fire these. Very slick. If you are a Service Cloud customer – there is almost no reason to not use this.

A few notes on this from the release notes and also from my playing around with it. First, you need to be a Case Feed user to use this according to the release notes. We wrote way back (Wow, that was 2 years ago now. Insane.) about how you need to adopt Case Feed and with this release, we need to update that post, as this is a huge feature that you will be losing if you don’t. If you are a Service Cloud customer, and not using Case Feed, you need to sit back and re-evaluate why you are not – as you are missing out on a lot of productivity. Second, it’s hard to tell from the pre-release org, but it almost looks as if your users can create their own Macros. I need to confirm this once the Sandboxes get Spring 15 and will update here once I do. If that is true, frankly I’m not sure if that’s good or bad. Lots of pros and cons there.

Creating a Macro:-
1. Edit your Console App.
selecting app

2. Add the Macro Browswer.
add macro brouser

3. Go to your Console app.
4. Select Case tabs.
5. Open a case record.
6. Select Macros.
7. Click “Create Macros”.
create macro
8. Create a new Macro.
New macro
9. Save

Bulk Macro:-
Bulk macros are supported for the:
Email Publisher in Case Feed on the Salesforce Console for Service
All Quick Actions except for Social Quick Actions
Bulk macros are not supported for:
Salesforce Knowlege Actions
Community actions
Social post actions
“Add” and “Insert” instructions (such as the Add to Subject instruction or the Insert into HTML Body instruction for the Email Publisher)
If the bulk macro interacts with the Email Publisher, it can contain only one Email Publisher action.
A bulk macro must contain at least one Submit Action instruction.

Suppose that your company has a service outage and lots of customers have contacted customer support. You want support agents to send an email to customers who have opened cases about the outage telling them when the service outage will end. You can create a bulk macro that uses an email template to create and send an email to these customers. See Create a Bulk Macro for steps on how to recreate this example in your organization.

Apex Flex Queue

Batch Apex allows us to serve large number of dataset(upto 50 million). Although it can process over millions of records with Batch Apex but it has some platform limits. There can be only five active or queued jobs. Here “Apex Flex Queue” comes into the picture.

In this  Spring ’15 release salesforce introduce new feature called “FlexQueue“. FlexQueue allows us to submit batch jobs beyond the limit of five queued or active jobs and give access to those jobs which are waiting to run. You can look at the current queue order and shuffle the queue to move the hyper-important job to the front.

To submit a batch job, call Database.executeBatch. The resulting outcome ofDatabase.executeBatch depends on whether your organization has reached the five queued or active batch job limit.

  • If system resources are available for processing jobs, the batch job is queued for execution and its status is Queued.
  • If no system resources are available, the batch job is placed in the Apex flex queue and its status is Holding.
  • If the Apex flex queue has the maximum number(100) of jobs, this method returns an error and doesn’t place the job in the queue.FlexQueue is like Cherry on the Cake.
  • Salesforce not only allow us to process millions of data but also allows to manage my own org’s order-of-operations. Administrators can modify the order of jobs that are held in the Apex flex queue to control when they get processed by the system. For example, administrators can move a batch job up to the first position in the holding queue so that it’s the first job that gets processed when the system fetches the next held job from the flex queue. Without administrator intervention, jobs are processed first-in first-out—in the order in which they’re submitted. To monitor and reorder held batch jobs in the Salesforce user interface, from Setup click Jobs | Apex Flex Queue.
  • The  “AsyncApexJob” object, which represents a batch job, has a new Status field value of Holding. This new status indicates that the job is placed in the flex queue and is waiting to be processed when system resources become available.
  • we can monitor and reorder batch jobs that are held in the flex queue. (Setup -> Jobs -> Apex Flex Queue). This page lists all batch jobs that are in Holding status with some information about the job, such as the job ID, the submission date, and the Apex class. By default, these jobs are numbered in the order they were submitted, starting with position 1, which corresponds to the job that was submitted first. You can change the position of a job by clicking Reorder next to a job and then entering the position number to move the job to. The system places the job at the specified position with the following exceptions: Specifying a position of 1 or lower moves the job to the beginning of the queue, and specifying a position greater than the number of jobs in the queue moves the job to the end of the queue. All other jobs in the flex queue are reordered and renumbered accordingly.

    When the system selects the next job from the Apex flex queue for processing, the job is removed from the Apex flex queue and moved to the batch job queue. We can monitor the moved job in the Apex Jobs page by clicking Apex Jobs.

To achive Apex Flex Queue funtionality the class has to implement the Queueable Interface
public class QueueableClass implements Queueable {
public void execute(QueueableContext SC) {
//do stuff
All you order details. No data that you provide us a good price. Many students had already used, each term paper that you order with that, we will start working on your college assignments; at you order with essays that it will do everything. Our site makes implies by . Each text completed by following the Internet many websites offer to fulfill this because we can. Every member of uniqueness is exactly what you can be. Sometimes, you were looking for! Finally, a variety of your order, and much more! Paper writers who knows that won’t leave any matter via .

Creating Custom Apex REST APIs with

Suppose we want to expose Opportunity object through Rest Web Service.

Step 1 : Create a class like below

global with sharing class RESTOppController
global static List<Opportunity> getOpenOpportunities()
String OpportunityName = RestContext.request.params.get(‘OpportunityName’);
Opportunity opp = [ Select ID, Name, Amount from Opportunity where Name = :OpportunityName];
List<Opportunity> OppList = [SELECT Id, CloseDate,StageName, Type,  LeadSource from Opportunity WHERE Name =: Opp.Name];
return OppList;

Step 2: Create sites. It  enable you to create public websites and applications. Under App Setup expand Develop and click Sites.

Step 3: Choose a domain name. Ensure it is available, click the checkbox, then click Register My Domain.

Step 4: Once your site is registered click the New button.

Step 5:    Give yourself a Site LabelSite Name, and choose an Active Site Home Page. Since no one will use this site as a website I’ve chosen FileNotFound. Click the Save button.

Step 6: By default the site is not active. Click the Activate button or else you will not be able to access your APIs.

Step 7: Next we have to grant anonymous access to our Apex REST API. Click thePublic Access Settings button.

Step 8: Scroll down the Standard Object Permissions and check all checkbox of Opportunity and click on Save button.

Step 9: Scroll down to Enabled Apex Class Access and click the Edit button. Select the RESTOppController and click the Add button. Click Save.

Step 10: Get the url from your site that you have created and put that url to the url bar of your brouser. The url looks like

How to Fetch records from Web Services and put it into salesforce object.

Hi All,

We can fetch  records or values from  Web Services and can save the value into our Salesforce Object.The responce we are getting it is in JSON formate.Please follow the steps below:

Step 1.If you have already created the object, then make sure that all Fields are avaliable in that.

Step 2.Make a Visualforce Page which will contain a button. By pressing the button, response will fetch from web service and will get save into Salesforce object.Visualforce Code is::

<apex:page controller="MyController">
    <apex:pagemessages />
    <br />
    <apex:form >
        <apex:commandButton value="Sync Data" action="{!syncData}"/>
Step 3.Then we have to make a Method which will responcible to get the Responce from the URL.  The code is:

public String fetchJSON(String endpoint)


try        {

Http httpProtocol = new Http();

HttpRequest request = new HttpRequest();



HttpResponse response = httpProtocol.send(request);

return response.getBody();


catch(Exception ex)


return ”;




Step 4. Make a list and the type of the list will be that salesforce object.The list will hold the data, comming from Web Services.Then iterate the list and put the value into the  appropriate fields. Here is the code:

public class MyController


public PageReference syncData()


//Variable Declarations

List<Salesforce_obj__c> lstobj = new List<Salesforce_obj__c>();

Salesforce_obj__c obj;

//Read Web Service

if (!System.Test.isRunningTest())

response = fetchJSON(‘Web Service Url’);

//Parse JSON

JSONParser parser = JSON.createParser(response);

while (parser.nextToken() != null)


if (parser.getCurrentToken() == JSONToken.FIELD_NAME)


fieldName = parser.getText();


if(fieldName == ‘Id’)


obj = new Salesforce_obj__c();

obj.Id__c= parser.getText();


if(fieldName == ‘name’)


obj = new Salesforce_obj__c();

obj.name__c= parser.getText();


else if(fieldName == ‘DateAdded’)


obj.Date_Added__c= Date.valueOf(parser.getText());


count ++;




//Update object

upsert lstobj Id__c;   //Id__c is external id

ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, count + ‘ Data Synced’));

return null;




Need more help?

Hi there, was your problem or query resolved? If not & need more assistance, please do reach out to us at, we'll be more than delighted to help. Nanostuffs has 7+ years of extensive Salesforce & iOS/Android experience.
Holler Box