We have developed a Symfony 2 powered vacation planning system for Rocky Mountain Getaways (RMG) - a leading travel operator specializing in skiing destinations spread across the North and South Americas. This system is being used by RMG's call center agents and administrators, to handle vacation planning requests received from prospective travellers, over the phone or the Internet.
The entire inventory of vacation properties (numbering a few thousands) and other travel products along with their pricing and associated information are available in the system's database. These are returned when agents query for accomodations and other arrangements matching a prospective customer's request. Using these results, agents can build quotes, book reservations, accept online payments from customers, generate travel vouchers as PDF documents and deliver them to customers. These vouchers, when produced at destinations, enable customers to enjoy the vacations they ordered for. All payments due and payments made are tracked, to ensure a net positive cashflow for all transactions.
Any number of special offers can be created for specific properties or products and for specified periods. The special prices from these offers are available to agents while building their quotes, if specified criteria are met. A reservation can be partially or completely cancelled, after levying an appropriate cancellation fee. The system sends notifications to all concerned parties, when any critical event occurs. The system also offers vendor management, so that bookings and orders can be made with vendors, to fulfill customer reservations.
As a later addition, we implemented a Customer Relationship Management (CRM) module for this system. The CRM lets agents to schedule follow up tasks for each of their business opportunities. The system also auto-schedules some followup tasks based on predefined rules. All these tasks are displayed in a calendar, aptly color coded according to priority, completion status, etc. The calendar is a very flexible interface, allowing edits of tasks, addition of new tasks, providing drag and drop rescheduling of tasks, etc.
We used Symfony 2, a leading PHP based MVC framework, to implement this complex system. We developed many custom bundles to manage the inventory, sales cycle, specials, notifications, and other specialized functions that we have offered. We have also integrated some third party bundles for Symfony such as SonataAdminBundle - to manage the CRUD (Create Read Update and Delete) operations of the diverse datasets, and FOSUserBundle to handle user authentications.
Doctrine ORM (Object Relational mapper) which comes bundled with Symfony, was used to manipulate the data layer with just PHP code. Symfony's form component was used to build all the forms. There was a need to seamlessly connect this application with RMG's Drupal website, for back and forth transfer of content. We accomplished this by enabling Drupal's Services module and making cURL requests from Symfony, to Drupal's REST server. Likewise, the application connects with Authorize.net payment gateway to verify and capture card payments, using the SDK provided by Authorize.net.
Twig templates were used to accomplish an elegant presentation of the application's user interfaces. Jquery was extensively used to achieve a high degree of interactiveness, so that the web application looks and behaves like a desktop application.
Another subsequent enhancement was to modify the techology used to deliver notifications to users. Earlier, the server was polled by a client-side script once every few seconds using AJAX requests, to fetch any notifications. As the number of concurrent users increased, the periodic AJAX requests from them was causing a performance drain. So, we modified the architecture a bit and brought in a Node.js component. In this new infrastructure, a Node.js server is used to create IO sockets with every client computer. Notifications if any are delivered to the Node.js server, which then pushes them to the appropriate client computer in real-time over the IO socket.
The project required a development effort spanning a few person years. Agile processes were used to manage user requirements, as well as the development lifecycle.