Over the last couple of years this is the single biggest thing we've really noticed is missing if you are looking from a perspective of implementing arbitrary commercial projects in ocPortal. It's a requirement that keeps coming up for commercial interests.
Moreover though, we did some research and actually couldn't really find may good solutions out there in general. There are plenty of commercial web services out there (e.g. Eventbrite or TourCMS), but we couldn't find a single half-decent Open Source PHP booking engine out there, and most of the commercial ones had encrypted source code or other onerous issues. We even looked into porting one from another CMS (e.g. Joomla), but we just found similar problems.
So when the opportunity came up to make one, I decided to jump at the chance and make something powerful and flexible. I wanted something that would work for all the common kinds of booking scenario, such as:
- Hotel booking
- Flight booking
- Events booking
- Theatre booking
- Meeting room booking
At this point I must add that I don't consider our solution 'finished'. For one thing, I am still debugging it today (I'm just taking a break now to announce it!). But moreover there are some extra features that will need adding to make all the above cases realistic. The important thing though is we have designed and implemented a very well-engineered core system that caters for it all, and the rest is just much smaller detail that we can work out fairly easily on a project-by-project basis.
So, what can our system do?
- You can add as many categorised 'bookables' as you want. These could be types of hotel rooms, kinds of flight seat, specific events, theatre seat types, or whatever you might imagine.
- You can also add 'supplements'. Supplements may be shared between bookables if you want, so you could add a 'Breakfast' option to all your hotel rooms, or a 'Safari tour' supplement.
- You can add 'black outs' to selections of bookables, e.g. if the hotel is closed over Christmas.
- You have further control over dates, such as limiting how far ahead bookings can be made, or closing off bookings before or after a certain date (e.g. to limit bookings to a summer season).
- The quantity of bookables is controlled, so you can prevent over-selling. Proper error messages and guidance are given throughout to help you see why certain dates might not be available.
- Customers may choose what bookables they want (in what quantity), what supplements they want (in what quantity), and what date range they want (unless the bookable is configured not to use date ranges).
- The customer has the ability to enter notes to the staff, and the templating API allows support for templating in extra typed fields to gather.
- Notification emails are sent to the customer and to staff.
- Bookings are attached to a member account, but you can sign up inline as part of the process (i.e. integrated signup). Because the bookers have member accounts, you can of course do stuff such as send newsletters to past customers.
- Staff may edit bookings, such as changing dates, or quantities, or chosen supplements.
- Staff may manually add bookings for a member.
- iCal feeds are exported showing bookings, showing availability, and showing bookables. This is great for integrating with third party systems.
- The bookings are automatically integrated to show on top of ocPortal's calendar.
We're not planning to release this as an addon yet. Like everything we're staging for the future, it's publicly available in github, but it'll need some polish first. This announcement is more to make people aware what ocProducts can do now on commercial projects with much more ease than previously, and in time (depending on how many projects we get) we hope to polish off the addon and release it formally.
Here's what we have not yet done, but have accommodated within our core design (i.e. we want to add):
- Online payment (currently it is booking-only, not payment).
- Promo codes for supplements. This is a clever way to make discounts work in a simple way: you add a supplement with a negative price and a promo code, and to enable it and get the discount the member must enter the promo code correctly.
- Permissions for bookables, so access to some bookables are limited by usergroup membership.
- Manual choice of 'codes'. 'Codes' are our way of encoding things such as seats or room numbers, but currently they are dished out arbitrarily. We'd like to allow the customer to select them, and generally to do a better job of providing continuity. Currently they are there more to track availability than to assign people to room/seats.
- Control over repetition patterns. Currently you may book based on selecting a date or date range, but really we want to allow things such as events that only fall on a specific day of the week, or only once ever, or only week days.
- Support for making black-outs black-out a set of codes rather than completely blacking-out availability of a bookable. For example, if a room is being refitted, you could black out the code for the room for a few days.
- Blocks (currently purchase is via a module, we want to allow integrating of cleaner blocks into the main design).
Hope you think this is as cool as I do .