Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

ntroduction

Dimensions are things that you can book, such as a room, a person or a product. Out of the box, Booker25 provides dimensions for Resources, Staff, Groups and Contacts. The first 3 are custom objects, while the last one is the Salesforce standard Contact object. This article explains what you can do with dimensions, and how you can create your own.

By using dimensions, you can:

  • make sure that bookable items are Included in the Booker25 conflict checking logic. More information about conflict detection: Conflict Checking
  • make sure that you only add available items to your reservations by using intelligent lookups (more on this below)
  • create calendars for bookable items that will show their reservations. This means you could show a calendar on a contact record page, on which you show in turn see that contact’s reservations. More information about calendars: Calendar Differences

Practical example

Imagine you have a fleet of cars and drivers. Your cars are stored in a custom Car object (Car__c), while your drivers are stored in the standard Contact object. You now want to track both your cars and drivers availability. As we mentioned earlier, Booker25 provides a Contact dimension, so you're all set as far as your drivers go. But how do you track your cars? And how do you make sure it does not cost you double work to track which car is assigned to which driver at each moment in time?

Simple! You create a Cars Dimension in Booker25. That way, when you create a reservation from either the driver or the car calendar, and link the other to it as well, Booker25 will draw that reservation on both calendar and keep both in sync at all times!

Technical overview

Dimensions are a powerful way of letting Booker25 know about records on any standard or custom object that are related to Reservations in, either through a lookup or via a junction object:

...

The Reservation object has a lookup to the other object.

...

Via a junction object

...

Video example

For a more visual introduction to Dimensions and an example of how they work, please have a look at this video.

Define Dimensions

First, we start by telling Booker25 about the object that holds the bookable items

...

Click New

...

The API name of an object to which reservations are related.

Following the example, this would be Car__c

Define Dimension Fields

Next, we configure a way to link bookable items to reservations

  1. On the Reservation object, create a lookup to the Car__c object. (We won't go into too much detail on this one, as it's basic Salesforce admin knowledge)
  2. Go back to the Dimension you created in the previous section
  3. Go to the Related tab
  4. Click New in the Dimension Fields section
  5. The only field you currently need to fill in is Dimension Field Name, in which you fill in the API Name of the field you created in step 1 of this section
  6. Click Save

The following tables goes into more detail regarding the function of the other fields:

...

Enables the advanced lookup filter on the reservation form for this dimension field.

The advanced lookup filter allows you to use autocomplete to search through valid related records. It will only show records in which the current reservation will be valid. So for example meeting rooms in closed buildings or staff that are unavailable because of holiday or sick leave will not be shown. Or if you have added a service to the reservation, it will only show records in which that service is actually available during the time of the reservation.

A known limitation of the advanced lookup filter is that it doesn't support custom lookup filters.

...

Controls if this dimension field gets populated with the related record id when creating a new reservation on the calendar.

Options:

  • Never - The field will not be populated
  • Only when on form - The field will only be populated if it is visible on the reservation form
  • Only when on form and required - Same as above but only if the field is required on the form
  • Always - The field will always be populated, even if it isn't visible on the form

...

Defines the behavior when Reservations are saved outside of the available times for the related dimension record.

  • None - Allow the Reservation to be saved
  • Soft - Allow the Reservation to be saved, but show a warning to the user and enter a Conflict record in the database
  • Hard - Don't allow the Reservation to be saved, and show an error message to the user

For more information, see this article about Conflict Checking, and this article about Availabilities

...

Introduction

Dimensions are things that you can book, such as a room, a person or a product. Out of the box, GoMeddo provides dimensions for Resources, Staff, Groups and Contacts. The first 3 are custom objects, while the last one is the Salesforce standard Contact object. This article explains what you can do with dimensions, and how you can create your own.

By using dimensions, you can:

  • make sure that bookable items are Included in the GoMeddo conflict checking logic. More information about conflict detection: Conflict Checking

  • make sure that you only add available items to your reservations by using intelligent lookups (more on this below in the Define Dimension Field section)

  • create calendars for bookable items that will show their reservations. This means you can show a calendar on a contact record page for example, on which you show in turn that contact’s reservations. More information about calendars: Calendar Differences

Practical example

Imagine you have a fleet of cars and drivers. Your cars are stored in a custom Car object (Car__c), while your drivers are stored in the standard Contact object. You now want to track both your cars and drivers availability. As we mentioned earlier, GoMeddo provides a Contact dimension, so you're all set as far as your drivers go. But how do you track your cars? And how do you make sure it does not cost you double work to track which car is assigned to which driver at each moment in time?

Simple! You create a Cars Dimension in GoMeddo. That way, when you create a reservation from either the driver or the car calendar, and link the other to it as well, GoMeddo will draw that reservation on both calendar and keep both in sync at all times!

...

The easy option

GoMeddo also includes a Calendar Wizard, which allows you to select any custom or standard object and creates calendar records for that dimension. See the main article here: Calendar Wizard

Technical overview

Dimensions are a powerful way of letting GoMeddo know about records on any standard or custom object that are related to Reservations in, either through a lookup or via a junction object:

Through a lookup

The Reservation object has a lookup to the other object.

An example of this is the Resource object, to which Reservation has a lookup.

Via a junction object

The Reservation object is linked to the other object through a third object, which has lookups to both Reservation and the other object. This Salesforce knowledge article explains what a junction object is.

An example of this is the Contact object, which is linked to Reservation through the ReservationContact junction object. ReservationContact has a lookup to Reservation and to Contact.

Dimensions & Dimension Fields

Now let's have a look at how you configure this

Define Dimensions

First, we start by telling GoMeddo about the object that holds the bookable items. We assume the object you want to use already exists. Else, start by creating a custom object.

  1. Go to the GoMeddo app

  2. Click on the Dimensions tab

  3. Click New

  4. Fill in the following fields

Field

Type

Required

Description

Dimension Object Name

Text

Yes

The API name of an object to which reservations are related.

Following the example, this would be Car__c

Availability Lookup

Text

No

The API name of a lookup from the B25__Availability__c object to the dimension object.

Filling out this field allows you to define availabilities for the records belonging to this dimension. If this field is left blank, GoMeddo assumes your dimension is always available.

Sync Field

Text

No

Required for Google and Outlook synchronization. Please see the relevant articles here and here.

The fields below are only necessary if you have Conflict Rules enabled and want to use Resource Grouping :

Field

Type

Required

Description

Dimension Grouping SObject Name

Text

No

API name of the object containing the grouping data.

Dimension Grouping Lookup One

Text

No

API name of a lookup on the grouping object to the dimension.

Dimension Grouping Lookup Two

Text

No

API name of a lookup on the grouping object to the dimension.

Dimension Grouping Active Checkbox

Text

No

(Optional) API name of a checkbox on the grouping object to indicate it is active.

The fields below are only necessary if you do not have Conflict Rules enabled:

Field

Type

Required

Description

Use Shared Conflict Checking

Checkbox

Yes

Should be enabled for most use cases. When disabled, fields and junctions within this dimension don’t conflict with each other. More info here.

Double Booking Checking

Picklist

Yes

Defines how strictly GoMeddo should treat detected double bookings in this dimension. Required unless ‘Use Shared Conflict Checking’ is disabled. More info here.

Double Booking Matching Condition

Text

No

Should be blank for most use cases. Allows you to selectively apply double booking detection only to reservations matching this condition. More info here.

Define Dimension Fields

Next, we configure a way to link bookable items to reservations

  1. On the Reservation object, create a lookup to the object that holds the bookable items. In our example, this is a lookup to the Car__c object. (We won't go into too much detail on this one, as it's basic Salesforce admin knowledge)

  2. Make sure the field is part of the correct field set you will be using

  3. Go back to the Dimension you created in the previous section

  4. Go to the Related tab

  5. Click New in the Dimension Fields section

  6. The only field you currently need to fill in is Dimension Field Name, in which you fill in the API Name of the field you created in step 1 of this section

  7. Click Save

The following tables goes into more detail regarding the function of the other fields:

Field

Type

Required

Description

Dimension

Lookup

Yes

The Dimension record that is the parent of this Dimension Field.

Dimension Field Name

Text

Yes

The API name of a lookup field on Reservation.

Enable Advanced Lookup Filtering

Checkbox

No

Enables the advanced lookup filter on the reservation form for this dimension field.

The advanced lookup filter allows you to use autocomplete to search through valid related records. It will only show records in which the current reservation will be valid. So for example meeting rooms in closed buildings or staff that are unavailable because of holiday or sick leave will not be shown. Or if you have added a service to the reservation, it will only show records in which that service is actually available during the time of the reservation.

A known limitation of the advanced lookup filter is that it doesn't support custom lookup filters.

Auto Populate on Calendar

Picklist

Yes

Controls if this dimension field gets populated with the related record id when creating a new reservation on the calendar.

Options:

  • Never - The field will not be populated

  • Only when on form - The field will only be populated if it is visible on the reservation form

  • Only when on form and required - Same as above but only if the field is required on the form

  • Always - The field will always be populated, even if it isn't visible on the form

Availability Checking

Picklist

Yes

Defines the behavior when Reservations are saved outside of the available times for the related dimension record.

  • None - Allow the Reservation to be saved

  • Soft - Allow the Reservation to be saved, but show a warning to the user and enter a Conflict record in the database

  • Hard - Don't allow the Reservation to be saved, and show an error message to the user

For more information, see this article about Conflict Checking, and this article about Availabilities

Double Booking Checking

Picklist

Yes

Defines the behavior when double bookings are detected for Reservations in this Dimension.

  • None - Allow the Reservation to be saved

  • Soft - Allow the Reservation to be saved, but show a warning to the user and enter a Conflict record in the database

  • Hard - Don't allow the Reservation to be saved, and show an error message to the user

For more information, see this article about Conflict Checking.

Dimension Allow Double Booking Field

Text

No

The API name of a checkbox field1 on the related dimension object. When Enforce Double Booking Check is enabled, but this field on the related record equals true, the double booking is allowed.

Reservation Allow Double Booking Field

Text

No

The API name of a checkbox field1 on reservation. When Enforce Double Booking Check is enabled, but this field on the reservation equals true, the double booking is allowed.

Capacity Checking

Picklist

Yes

Defines the behavior when a Reservation's quantity exceeds the Dimension's capacity.

  • None - Allow the Reservation to be saved

  • Soft - Allow the Reservation to be saved, but show a warning to the user and enter a Conflict record in the database

  • Hard - Don't allow the Reservation to be saved, and show an error message to the user

For more information, see this article about Conflict Checking.

Dimension

...

Capacity Field

Text

No2

The API name of a

...

number field3 on the related

...

object, which holds the capacity of the related record. This capacity can't be exceeded if Enforce Capacity Check is enabled.

Reservation Quantity Field

Text

No2

The API name of a number field3 on the reservation, which holds the quantity of the reservation. This quantity is checked to not exceed the related record's capacity if Enforce Capacity Check is enabled.

Reservation Skip Capacity Check Field

Text

No

The API name of a checkbox field1 on reservation. When

...

Capacity Checking is set to 'Soft' or 'Hard', but this field on the

...

related record equals true, the

...

Defines the behavior when a Reservation's quantity exceeds the Dimension's capacity.

  • None - Allow the Reservation to be saved
  • Soft - Allow the Reservation to be saved, but show a warning to the user and enter a Conflict record in the database
  • Hard - Don't allow the Reservation to be saved, and show an error message to the user

For more information, see this article about Conflict Checking.

...

1: Can also be a cross-object reference or a checkbox formula on Reservation. However the latter will not be set yet when working from the Reservation Form UI.
2: Required when Enforce Capacity Check is enabled.
3: Can also be a number formula, and can also be a cross-object reference.

Define Dimension Junctions

Dimensions Junctions are a way to let Booker25 know which junctions between a dimension and a reservation are important.

Info

A junction object is an object that sits in between two other objects (i.e. it has a lookup to each of the two objects). This creates a many-to-many relationship between those objects. For more information, see https://help.salesforce.com/articleView?id=relationships_manytomany.htm&type=5

...

  • Make this list visible on the reservation form
  • Make the reservation visible on the contact calendar for each contact in the list
  • (Optional) Make Booker25 detect and prevent double bookings for these contacts.
Warning

Don't forget to implement the trigger hook described in the next section, or junction records will not be properly checked for conflicts.

Warning

There is an edge case where you can get an error like this: SObject row was retrieved via SOQL without querying the requested field: B25__Reservation__c.<junctions>__r (where <junctions> is your relationship name).

This error happens when you have both a field and a junction under the same dimension, both with Availability Checking: None. A workaround for this error is to give either the field or the junction Availability Checking: Soft or Availability Checking: Hard.

...

reservation will be saved normally.

1: Can also be a cross-object reference or a checkbox formula on Reservation. However the latter will not be set yet when working from the Reservation Form UI.
2: Required when Enforce Capacity Check is enabled.
3: Can also be a number formula, and can also be a cross-object reference.

Create a calendar

Create calendar config

Set up Calendars & Views

Create the actual calendar

Add a Calendar to a Lightning App Page

Tip

Done!

You are done as far as linking bookable items to your reservations in a 1-to-many fashion (via lookups) goes. If you proceed with the next section, you can build something similar for many-to-many relations (via junction objects).

Dimension Junctions

Dimensions Junctions are a way to let GoMeddo know which junctions between a Dimension and a Reservation are important. An example of this would be a Contact list, where you link multiple Contacts to a Reservation.

Using dimension junctions you can:

  • Make this list visible on the reservation form

  • Make the Reservation visible on the dimension calendar for each dimension record in the list

  • Make GoMeddo detect and prevent double bookings for these contacts

Define Dimension Junctions

Now let's see how we can configure a Dimension Junction

  1. Create a junction object with two lookups (or Master-Details): one to Reservation and one to the object that holds the bookable items.That object is Car__c in our example. (We won't go into too much detail on this one, as it's basic Salesforce admin knowledge)

  2. Go back to the Dimension you created in the previous section

  3. Go to the Related tab

  4. Click New in the Dimension Junction section

  5. Fill in the fields from the following table:

Field

Type

Required

Description

Dimension

Lookup

Yes

The Dimension record that is the parent of this Dimension Junction.

Dimension Junction Name

Text

Yes

The API name of the junction object you just created

Reservation Lookup API Name

Text

Yes

The API name of the lookup (or master-detail) to Reservation. Make sure the actual field on the Junction object has the 'Allow reparenting: Child records can be reparented to other parent records after they are created' / 'Reparentable Master Detail' checkbox set to TRUE

Dimension Lookup API Name

Text

Yes

The API name of

...

the lookup (or master-detail) to

...

Defines the behavior when Reservations are saved outside of the available times for the related dimension record.

  • None - Allow the Reservation to be saved
  • Soft - Allow the Reservation to be saved, but show a warning to the user and enter a Conflict record in the database
  • Hard - Don't allow the Reservation to be saved, and show an error message to the user

For more information, see this article about Conflict Checking, and this article about Availabilities

...

Defines the behavior when double bookings are detected for Reservations in this Dimension.

  • None - Allow the Reservation to be saved
  • Soft - Allow the Reservation to be saved, but show a warning to the user and enter a Conflict record in the database
  • Hard - Don't allow the Reservation to be saved, and show an error message to the user

For more information, see this article about Conflict Checking.

...

1: Can also be a cross-object reference or a checkbox formula on Reservation. However the latter will not be set yet when working from the Reservation Form UI.

Create trigger hook

For every Dimension Junction you create, make sure you also create a Trigger for its object, which calls the following method: B25.DimensionJunctionTriggerHook.execute()

This makes Booker25 check permissions on the object. Make sure to replace <Dimension_Junction_API_Name> with the actual API name of your object, and <Trigger_Name> with a name that makes sense to you.

Code Block
trigger <Trigger_Name> on <Dimension_Junction_API_Name> (before insert, before update, before delete, after insert, after update, after delete, after undelete) {
	B25.DimensionJunctionTriggerHook.execute();
}

Displaying Dimension Junctions on the Reservation Form

After you have configured Dimension Junctions (see Configuring Dimensions & Dimension Junctions) you might want display this Related List on the Reservation Form and allow users to add new records. To do this, you have to create a Dimension Junction Display Setting record on each Reservation Type you want to display this related list for. You can find this by going to the Reservation Type record and then to the Related tab.

The Dimension Junction Display Setting has some additional fields that allow you to control certain aspects of this related list.

...

Field

...

Type

...

Required

...

Description

...

The label that will be shown on the header of the section that contains this dimension junction list. When left empty the plural label of the dimension object is used.

...

Can be used to increase performance if junction validation is slow. Allows the user to first select multiple new junctions, and postpones validation until after the user clicks the Add button.

...

the Dimension object

Create trigger hook

For every Dimension Junction you create, make sure you also create a Trigger for its object, which calls the following method: B25.DimensionJunctionTriggerHook.execute()

This makes GoMeddo check permissions on the object. Make sure to replace <Dimension_Junction_API_Name> with the actual API name of your object, and <Trigger_Name> with a name that makes sense to you.

Code Block
trigger <Trigger_Name> on <Dimension_Junction_API_Name> (before insert, before update, before delete, after insert, after update, after delete, after undelete) {
	B25.DimensionJunctionTriggerHook.execute();
}

Please be aware that a test class should be create which allows you to test this trigger. You can create a simple test class that inserts a reservation, a related object record and the dimension junction record. Here is an example that you can tweak to facilitate your use case

Code Block
languagejava
@IsTest
private class Test_B25_Reservation {

    @isTest private static void testDimensionJunctions() {
        B25__Reservation__c reservation = new B25__Reservation__c();
        reservation.B25__Start__c = DateTime.now();
        reservation.B25__End__c = DateTime.now().addHours(1);
        Database.insert(reservation);

        <YOUROBJECT>__c yourobject = new <YOUROBJECT>__c(); //replace this with the name of your object
        yourobject.Name ='a'; // if this is field is an auto number you dont need this.
        Database.insert(yourobject);

        Reservation_<YOUROBJECT>__c resYourobject = new Reservation_<YOUROBJECT>__c(); //replace Reservation_<YOUROBJECT>__c with the name of your dimension junction object
        resYourobject.Reservation__c = reservation.Id;
        resYourobject.<YOUROBJECT>__c = yourobject.Id; //replace this with the name of the lookup on the dimension junction
        Database.insert(resYourobject);

        System.assertEquals(1, [SELECT Id FROM B25__Reservation__c].size());
    }  
}

Display your Dimension Junctions on the Reservation Form

Displaying Dimension Junctions on the Reservation Form

Tip

Done!

Good job! You should now be able to add multiple bookable items to your reservations from the reservation form on the calendar! The sections below provide some additional information.

Additional fields information

The table below goes into more detail about each field on the Dimension Junction record.

Warning

There is an edge case where you can get an error like this: SObject row was retrieved via SOQL without querying the requested field: B25__Reservation__c.<junctions>__r (where <junctions> is your relationship name).

This error happens when you have both a field and a junction under the same dimension, both with Availability Checking: None. A workaround for this error is to give either the field or the junction Availability Checking: Soft or Availability Checking: Hard.

Field

Type

Required

Description

Dimension

Lookup

Yes

The Dimension record that is the parent of this Dimension Junction.

Dimension Junction Name

Text

Yes

The API name of an object. This object should be a junction between reservation and the dimension.

Reservation Lookup API Name

Text

Yes

The API name of a field on the object. This field should be a lookup (or master-detail) to Reservation. Make sure the actual field on the Junction object has the 'Allow reparenting: Child records can be reparented to other parent records after they are created' / 'Reparentable Master Detail' checkbox set to TRUE

Dimension Lookup API Name

Text

Yes

The API name of a field on the object. This field should be a lookup (or master-detail) to the dimension.

Availability Checking

Picklist

Yes

Defines the behavior when Reservations are saved outside of the available times for the related dimension record.

  • None - Allow the Reservation to be saved

  • Soft - Allow the Reservation to be saved, but show a warning to the user and enter a Conflict record in the database

  • Hard - Don't allow the Reservation to be saved, and show an error message to the user

For more information, see this article about Conflict Checking, and this article about Availabilities

Double Booking Checking

Picklist

Yes

Defines the behavior when double bookings are detected for Reservations in this Dimension.

  • None - Allow the Reservation to be saved

  • Soft - Allow the Reservation to be saved, but show a warning to the user and enter a Conflict record in the database

  • Hard - Don't allow the Reservation to be saved, and show an error message to the user

For more information, see this article about Conflict Checking.

Dimension Allow Double Booking Field

Text

No

The API name of a checkbox field1 on the dimension. When Enforce Double Booking Check is enabled, but this field on the related record equals true, the double booking is allowed.

Reservation Allow Double Booking Field

Text

No

The API name of a checkbox field1 on reservation. When Enforce Double Booking Check is enabled, but this field on the reservation equals true, the double booking is allowed.

Junction Allow Double Booking Field

Text

No

The API name of

...

Note: this setting is only supported on Lightning calendars.

If you get an error when saving a reservation with junction records, double check if you have implemented the trigger hook described in the final section of Configuring Dimensions & Dimension Junctions.

...

a checkbox field1 on the object itself. When Enforce Double Booking Check is enabled, but this field equals true, the double booking is allowed.

1: Can also be a cross-object reference or a checkbox formula on Reservation. However the latter will not be set yet when working from the Reservation Form UI.

General Performance Considerations

For performance reasons, it is good practice to only have the minimum number of Dimensions

...

, especially ones that are configured for conflict checking.

...