Looking for a booking / reservation tool in Confluence
Asked by Jan:

As we are using Confluence as a social intranet with the Linchpin Plugins, we would like to provide a booking (reservation) function for several purposes.

We are already using the Event Plugin from Seibert for Event registrations with which users can register for events with limited capacities.

Now we need something where users can book / reserve time slots that can be pre defined.

**Requirements:**

1. Providing time individual time slots on specific days / time ranges with capacities
2. Users can book in to these time slots; as soon as capycity is full, the slot is not available
3. Notifications and reports

**Examples:**

* We are having yearly flu vaccinations where you can opt in for 5 mins time slots.
* We are having a massage seat (1 for 2000 emplyoees) where you can reserve 30 mins or 40 mins slots
* Probably more use cases when something like this would be available


Answers:
author: Davin Studer
body: Check out the [ConfiForms add-on](https://marketplace.atlassian.com/plugins/com.vertuna.confluence.plugins.confiforms/server/overview). You can do this, and so much more, with it. I don't work for them, we just use it in our environment and I know it can do what you are asking. There might be other add-on in the marketplace can can do this kind of thing as well, I am just not as familiar with them.

comments: author: Jan
body: Thanks [@Davin Studer](/t5/user/viewprofilepage/user-id/781467) - I am just playing a little with ConfiForms and I really like it a lot. But I did not find out how to do what I was looking for above, here is an example:

- There are 10 minute time slots available on a specific day's afternoon

- Each time slot can be booked by one user and are blocked afterwards

- When loading the page with form, a user should see or be able to book available slots only


author: Rafael Reder
body: Hi

Have you found something? I am searching for something similar.

We need a booking/reservation system in our company for rental devices and meetingrooms.

Regards.


author: Jan
body: Unfortunately not yet, [@Rafael Reder](/t5/user/viewprofilepage/user-id/1187503). I guess someone developping an Addon could make a fortune :)


author: Davin Studer
body: We recently ran into this very issue. I have written a user macro for ConfiForms that will limit the number of entries per dropdown field option. This may not be exactly what you are looking for but the concept could be adapted.

**Macro Name:**   
confiforms_limit_dropdown_options

**Macro Title:**   
ConfiForms Limit Dropdown Options

**Description:**   
This macro will limit a ConfiForms dropdown field to only have a certain number of entries for each option.

**Macro Body Processing:**   
No macro body

**Template:**

```
## Developed by: Davin Studer## Date created: 12/07/2018## @param Page:title=Page name where the form is defined|type=confluence-content|required=false|desc=Leave blank if the form is defined on the same page## @param FormName:title=ConfiForms Form name|type=string|required=true|desc=## @param Field:title=Field name|type=string|required=true|desc=## @param Max:title=Max per option|type=int|required=true|desc=The max number if entries per option of the specified field name.#set( $containerManagerClass=$content.class.forName('com.atlassian.spring.container.ContainerManager') )#set( $getInstanceMethod=$containerManagerClass.getDeclaredMethod('getInstance',null) )#set( $containerManager=$getInstanceMethod.invoke(null,null) )#set( $containerContext=$containerManager.containerContext )#set( $pageManager=$containerContext.getComponent('pageManager') )## Create a unique ID for this macro so it can be put on a page multiple times#set( $id = $action.dateFormatter.calendar.timeInMillis )## A velocity variable to get around issues with velocity and jQuery#set( $d = '$' )## Get the id of the current page or the page specified in the macro parameters#if( $paramPage && $paramPage != "" )    ##########################    ## Get the page manager ##    ##########################        ##########################    ## Find the page        ##    ##########################    #set( $parts = $paramPage.split(":") )    #set( $i = 0 )    #set( $len = 0 )    #set( $key = "" )    #set( $name = "" )    ##Having trouble finding out the length/size of $parts ... brute force it    #foreach ( $part in $parts )        #set ( $len = $len + 1 )    #end        #if ( $len == 1 )        #set ( $key = $content.spaceKey )        #set ( $name = $paramPage )    #else        #foreach ( $part in $parts )            #if ( $i == 0 )              #set ( $key = $part )              #set ( $i = $i + 1 )           #else              #set ( $name = $part )           #end        #end    #end    #set ( $tempcontent = "" )    #if ( $pageManager )        #set ( $tempcontent = $pageManager.getPage($key, $name) )    #end    #if ( $tempcontent && $tempcontent != "" )        #set( $pageId = $tempcontent.id )    #else        The page "$paramPage" was not found in this space.        #set( $pageId = "" )    #end#else    #set( $pageId = $content.id )#end<script type="text/javascript">//<![CDATA[var ConfiFormsDropDownFilter${id} = {    pageId: $pageId,    formName: '$paramFormName',    fieldName: '$paramField',    maxCount: $paramMax,    init: function(){        var t = this;        var json = t.getData(t.pageId, t.formName);                // Don't bother to do anything if there are no entries        if(json.list.entry.length > 0) {            // Loop through the dropdown options and count how many entries have that option            AJS.$('select[id=i_' + t.fieldName + '] option').each(function(){                var count = 0;                var val = AJS.$(this).val();                for(var i in json.list.entry) {                    if(typeof json.list.entry[i].fields[t.fieldName] !== "undefined" && val == json.list.entry[i].fields[t.fieldName]) {                        // This entry counts against the max number for this option                        count ++;                    }                                        if(count == t.maxCount) {                        // We've hit the max entries for this option ... remove it and go to the next option                        t.removeOption(t.fieldName, val);                        break;                    }                }            });        }    },    getData: function(pageId, formName) {        var t = this;        var url = AJS.params.baseUrl + '/ajax/confiforms/rest/filter.action?pageId=' + pageId + '&f=' + formName + '&q=';        var ret = null;        AJS.${d}.ajax({            url: url,            async: false        })        .done(function (json) {            ret = json;        })        .fail(function (jqXHR, textStatus) {            ret = null;        });        return ret;    },    removeOption: function(field, option) {        var t = this;        AJS.$('select[id=i_' + field + '] option[value="' + option + '"]').remove();    }};AJS.toInit(function(){    ConfiFormsDropDownFilter${id}.init();});//]]></script>
```


author: Jonathan
body: Hi Davin,

ok thanks, how exactly would this be to incorporate in a ConfiForms Form?

Would I build a form for each day or each timeslot? or is there a way to do it all in one form?


author: Davin Studer
body: Just build your form like normal. Have the dropdown have all the entries. Then put this user macro on the page ... anywhere on the page. Set up the properties in the user macro and when you visit the form it will check the current entries in the form and if you have reached the max number of entries for any dropdown option it will be removed from the dropdown.


author: Jonathan
body: Hi,

thanks, I got it to work now, I had the user makro inside the confiforms box which did not work.

A really nice imrpovement would be to be able to use the Datetime slot field for this instead of a dropdown list. Also Datetime slot should be restrictable, e.g. define half hours slots but only between 11 and 13.

But it's quite close to what we need :)


author: Jonathan
body: [@Davin Studer](/t5/user/viewprofilepage/user-id/781467) one more problem we just stumbled on.

It seems like the dropdown limiter macro only works for users with page edit rights for some reason? I just testet this with a user with read-only permissions (which would be the vast majority of users filling out the form ideally) and with that user I had the used-up slot options still available to choose from whereas users with page edit rights would not see those options any more.

Any way we can quickly fix that?


author: Davin Studer
body: You will need to check this in the form definition.

![image.png](https://community.atlassian.com/t5/image/serverpage/image-id/94934iBA81E8146615BF87/image-size/large?v=v2&px=999 "image.png")


Tags: confiforms