It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

Looking for a booking / reservation tool in Confluence

Jan Mar 08, 2018

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

 

1 answer

2 votes
Davin Studer Community Leader Mar 08, 2018

Check out the ConfiForms add-on. 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.

Jan Sep 26, 2018

Thanks @Davin Studer - 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

Rafael Reder Dec 06, 2018

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.

Jan Dec 07, 2018

Unfortunately not yet, @Rafael Reder. I guess someone developping an Addon could make a fortune :) 

Davin Studer Community Leader Dec 07, 2018

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>
Like # people like this

Suggest an answer

Log in or Sign up to answer
This widget could not be displayed.
This widget could not be displayed.
Community showcase
Published in Confluence

6 Awesome Ways to Apply Trello, JIRA and Confluence to your Project

I attended  Atlassian Summit 2019  and learned a lot from the presenters, attendees and knowledgeable Atlassian product managers. The presentations I attended focused on applying Agile, pla...

2,402 views 11 28
Read article

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you