Employee Work Schedule / Multi-calendar

Employee Work Schedule / Multi-calendar

Employee Work Schedule / Multi Calendar


Dashboard with many options

Multiple calendars


Users can register themselves [optional] or the admin can add users.


Hour calculation

Drag & drop possible

Assigning possible

Public, private and group calendars

Recurring events

Notifications on screen and/or by email

Printing views

PDF export

I welcome new features

More info

This calendar application is very flexible and has many options. Adding items to the calendar is very easy and quick. Unlike other calendar solutions this calendar is very versatile and for every event you have many fields to fill in (optionally) and you can even create own custom edit dialog fields. Drag and drop is possible and also clicking and selecting dates in the calendar views.
An admin can assign items to employees easily.

You can schedule employees to several calendars/spaces (rooms, shops etc.) or you can do it the other way around; add the employees as calendars and assign spaces to them.

It’s a complete JavaScript calendar system, with the base jQuery Fullcalendar, Bootstrap and a PHP/MySQL backend. All Fullcalendar options can be set from the dashboard, you don’t have to go in the code yourself.
The calendar can be accessed with a login, on IP address or public use for everybody.

Unique features
- Every minute (or faster) notification on admin’s client pc when a user adds/changes an event
- Inserting, editing and deleting items is fast and easy.
- Powerful searching of the complete current calendar.
- Public, private or group calendars.
- Besides admin(s) now users can also create calendars.
- Supports recurring events.
- New view with period selection
- You can create two custom dropdowns, the events can also be filtered on those.
- Multilanguage: English, Dutch, German, Spanish, French, Norwegian, Italian, Polish and Czech. You can add your own language file.
- Automatic backup of database including data. (no knowledge of cronjobs necessary)
- The complete calendar is searchable. And the search results can be clicked to go to the event in the calendar. The search results depend on the chosen calendar
- Extensive dashboard, with Hour calculation, User administration, Group administration, Calendar administration and settings. in admin area
- Set alterable range and the option to make the dates gray
- Set active range
- Mobile / Touch friendly
- Import users from a Wordpress users table.
- Possibility to move events to another calendar.
- Add files to an event.
- Admins (employees) can create Usergroups, with sepcified users.
- Securely show events from an Exchange account.
- You can predefine locations for each calendar, so choosing a location in the event edit dialog is easier.
- Notifications can be send to the admin/employer when an event is added/edited.
- Moving events to other calendars is possible.
- Users can be added to user-groups and a calendar can be assigned to such a group.

- Popup dialog for adding, editing and deleting items.
- Choose date and time formats, choose 24 hr. or AM/PM.
- Title fist or time first
- Drag and drop items, external and within the calendar.
- It uses Fullcalendar, a jQuery plug-in.
- Resizing calendar items.
- Month-, week-, day- and listview.
- The calendar can stretch to whole screen width.
- Users can easily change their profile and settings.
- You can install it in a subdomain of your wordpress installation and add a link into one of the website pages to the calendar.

NEW! second list view, searchable and selectable period. You can choose what should happen after a click on an item.

When you have a linux server also make sure that all the folders are readable by group and others and system, dbdump and templates_c have to be writable.

I would appreciate it if people with languages other than included in the calendar would be willing to share the languagefiles so i can include them in the calendar.

INSTALLATION NOTES: Some people seem to have trouble setting the path to the calendar. (FULLCAL_DIR in config.php)
This should be the path to your personal folder on your domain with your provider. You can find it in your provider dashboard or by putting this at the top of config.php: echo getcwd();
Other known startup problems are that the paths are set incorrect in config.php and all the folders should be readable and templates_c, system and system/dbdump should be writable by everyone.
Someone was having problems because some files were writable by group. The providers security didn’t allow that and an Exception (softexception) was thrown. Making it not writable for group fixed the problem.
Also some people had trouble with a https site, because the google api includes in cal.html arre http. changing the urls to https fixes the problem.

Working on

ICS support

Add events via a form outside of the calendar
Add employee availability and contracts
Adding Google calendars
Include events from an external table/database (already in Fast & Easy Calendar


Problem with setting a monthly recurring pattern because of newer jquery nor being backwards compatible.

problem with creating recurring events.

Fix: change this line in model/events.class.php on appr. line 1952:
'"' . $frm_submitted['dropdown1_option_id'] . '",' .
into this:
$str_query_r .= '"' . $frm_submitted['dropdown1_option_id'] . '",' .
and the piece after line 1942 should be like this:
if(!strstr($frm_submitted['team_member_id'], ',')) {
      if(!empty($frm_submitted['team_member_id']) && strstr($frm_submitted['team_member_id'], '_')) {
             $arr_teammember = explode('_', $frm_submitted['team_member_id']);
             $str_query_r .= '`assigned_by` = "' . $int_user_id. '", ';
             $int_user_id = $arr_teammember[1];
       } else {
             $str_query_r .= '`assigned_by` = "", ';
 } else {
       $str_query_r .= '`assigned_by` = "", ';

Installing for the 1st time

1. Extract the zip file and copy all the files to a folder on your server.
2. Create a database and execute all the queries in ‘calendar_complete_db_for_new_users.sql’.
3. Open configs/db.config.php and change the host, name, user and password to match with your database.
4. Open configs/config.php and change the paths (FULLCAL_DIR and FULLCAL_URL) to match your paths.
If you don’t know what the path-to-web-server should be you can remove the // in front of getcwd() and press f5 on your website. That will show the correct FULLCAL_DIR.
define(‘FULLCAL_URL’, $http_host . ’/employee-work-schedule’);
Don’t change $http_host.
5. Make all the folders readable
6. Make the following folders writable (773) for everyone:
– templates_c
– system
– system/dbdump
– system/uploads
Someone was having problems because some other folders/files were writable by group.
The providers security didn’t allow that and an Exception (softexception) was thrown.
Making them not writable for group fixed the problem.

Installing updates

1. Extract the zip file and copy all the files, NOT the configs folder, uploads folder and templates_c, to your server.
2. Check the change.log if there are database updates. If there are, execute the queries that are in the updateXX.sql file.
3. Check the change.log if there are any new config-options. If there are, add them to your config.php.

Common mistakes

1. Incorrect paths in configs/config.php
2. Incorrect database credentials in configs/db.config.php
3. File/folder permissions incorrect. Only a few folders (and files in it) have to be writable. see point 6 in section ‘Installing for the 1st time’.
4. Forgetting to execute the database queries.

Summary of Updates

All the updates are in the changelog. The most important updates are here:

Update 1 (16-3-2015) – update 20:
Added the possibility to show a mouseover with event details.
Added a scrolling timepicker which also supports AM/PM.
Added possibility to show the events in AM/PM timeformat.
Added possibility to set one or more calendars as default calendar(s), so their items will be opened on initial view of the calendar.
Improved layout for mobile devices
Added posibility to ignore timezones
Added hour calculation of employees in admin area, with ability to filter the results by calendar and period.
Added many options to the settings form in the admin area, easier than setting them in config.php.
Simplified and improved permissions.
Share_type of a calendar can be set now. (public, private of private_group)
It’s really multi-calendar now, besides the employee work schedule functionality.
Added possibility to quickly add new users and new admins.
Added possibility for users to create their own calendars.
Removed wordcloud functionality, because the hourcalculation part made that unnecessary.
Added possibility to show description, location and phone in week view, day view and list view
Added print button for calendar and everything in admin area.
Added possibility to export parts of admin area to Excel.
See and undelete deleted calendars in admin area.
Set calendar active, inactive or active for specific period.
Set alterable range, with config option MASK_UNALTERABLE_DAYS you can choose if you want the unalterable days to be gray.
2 added fields (active and alterable range) in admin panel (last update) should also have been added in user panel
Little change in permissions, so admin with FULL_CONTROL can also see public calendars
Current event is shown in admin dashboard.
Possibility to mail an event to an emailaddress that is set for a calendar. Another admin emailaddress, subject and body (with variables) can be set in config.php
- Added possibility to move event to another calendar
- Notifications to admin/employer by email when user adds or changes an event
- Nicer looking messages
- Included yearly recurring possibility, SQL update necessary, see update7.sql for existing users, for new users it’s in the complete_db_for_new_users.sql.
Fixed a syntax error in mailEvent in cal_events.php (overlooked that one)
Added possibility to set a color and info for a DD-item. (info field is used for mouseover for DD-item, SQL queries needed, see update8.sql for existing users, see complete_db_for_new_users.sql for first installation)
Automatically insert 1 calendar if there is no calendar in the database.
Added possibility to show URL field in the edit dialog
Added Italian language file: langIT.js
Calendar name is now configurable.
IMPORT USERS FROM WORDPRESS TABLE: Added possibility to import users from Wordpress wp_users table. (CSV)
TOUCH FRIENDLY: Made drag & drop and daycell select working on touch devices, configurable in config.php.
Added checkbox in profile edit form to set a user active.
Added possibility to upload and attach files to events, SQL update and 2 config options added: SHOW_FILE_UPLOAD, MAX_EVENT_FILE_UPLOAD, don’t forget to add a writable folder: ‘uploads’.
Added Czech language
3 new config options, to determine which day is first day of week, which hour should be scrolled to initially and which hour should be first visible hour
Improved error catching for new installations, e.g. check on correct ‘calendars’ table and check if the path to the files directory on the webserver doesn’t start with http, an error that some people make. (changed files: /config/config.php and /model/calendar.class.php)
The superadmin with FULL_CONTROL can see the calendar buttons on the frontend now.

Update 21 (4-10-2015)
New config option to define if the weekend days are visible: SHOW_WEEKENDS
Tweak: The dates are not automatically set anymore when the ‘error in dates’ error is not triggered.
The dropdownlist with calendars to which you can move an item must only be visible when there is at least 1 calendar to show.
Added possibility to disable automatic database backup.

Update 22 (21-11-2015)
SQL update 10 needs to be inserted !! (for existing users)
Admins (employees) can create user-groups now.
Added possibility to predefine the locations for a calendar. If locations are predefined a dropdownlist is shown in the event edit dialog instead of a textfield.
Added to recurring options: daily – every x days and weekly – every x weeks.
Added a logout button in dashboard.
Translated calendar section of dashboard.
Removed config-options, because they can be set for each calendar now: SHOW_LOCATION_FIELD, SHOW_URL_FIELD, SHOW_DESCRIPTION_FIELD, SHOW_PHONE_FIELD

Update 23 (25-11-2015)
Added possibility to make fields required in the edit dialog.
Moved settings (show description, location, phone and url) to calendar edit form.
Fixed: in some cases deleted calendars where showed.
Fixed: For some timezones a recurring event started a day to early.
Fixed some notices
Inserted missing ; in the SQL update file

Update 24 (29-11-2015)
Added possibility to make it impossible to edit an event by two users at the same time. (config-option: SAVE_CURRENT_EDITING)
Execute the query in update_11.sql
Tweak: when an event is moved to another calendar, the event has to get the color of the calendar it is added to.

Update 25 (1-12-2015)
Tweaked the functionality that only 1 person at the time can edit an event.
? After 30 minutes the still active rows are set to inactive.
? Added a listener to the close button (x) of the edit dialog so the row can be set to inactive.
? Default value for SAVE_CURRENT_EDITING is now ‘false’.
? After calendar refresh the rows are set to inactive now also.
Expanded searching so it also searches in description and location.
Fixed: initially not all the fields in the edit dialog were visible when more than one calendar was initially set to be visible.

Update 26 (9-12-2015)
Optimized amount of queries being done.
Fixed: first day of week, first scroll hour and min visible time were not working.
Changed possible values for SCHEDULE_SQLDUMP to ‘day’, ‘hour’ or ‘never’.
Updated documentation

Update 27 (14-12-2015)
Added possibility to change font color for recurring events and to show an icon in front of the event title. New config-options: RECURRING_EVENT_TEXT_COLOR, SHOW_RECURRING_EVENT_ICON
Added possibility to set the default time duration when dragging. (30, 60 or 120 minutes, config-option: DEFAULT_EVENT_DURATION)
Added lines to language files.
Added possibility to set a group calendar viewable to others.

Update 28 (14-1-2016)
Tweak: Phonenumbers are clickable now. (not fully tested) Several functions on phones are possible that way.
Added possibility to create a PDF of selected period, works in all views and with 1 or more calendars selected. (basic text or table-like)
Added possibility to assign items to users with user-group DD_items, for each calendar you can choose if you want the DD-items to be used for assigning or not.
Added possibility to send email to the user that was assigned an item to. When opening the event you can see who assigned the event. You can choose to show an icon on the event with the new config-option: SHOW_ASSIGNED_BY_ICON.
Added a line in config.php to better determine if a website is https.

Update 29 (3-2-2016)
Added possibility to set a start- and end time for a DD-item. They are used while drag and drop in the monthview. ? When mouseover the DD-item the times get visible for quick reference.
Added some lines in language files.
Added possibility to set a start- and end time for a DD-item. They are used while drag and drop in the monthview. ? Added possibility to copy events. – added config-option COPY_EVENT_POSSIBLE.
Added some lines in language files.
Added possibility to set the sorting order for calendars in the database. (in next update it will be changeable in the dashboard) – added config-option: SORT_ALL_CALENDARS_BY_CAL_ORDERID

Update 30 (13-2-2016)
Added possibility to have night-shift DD-items.
Tweak: night shifts now take 2 days of space on the calendar.
Tweak: The automatic back-up of the database is now only exporting the calendar tables, so no chance of reaching memory limit when you have put the tables into another existing database with many tables.

Update 32 (24-2-2016)
Added: team member combo in edit dialog and also possibility to assign with that, you set the visibility of this field for every calendar
Added team-member in mouseover and icons for location, phone, url and team-member
Added lines to language files

Update 34 (20-4-2016)
Added possibility to create 2 custom dropdown that can be showed in the edit dialog and as extra filters on the left of the calendar.
Added lines to languagefiles
Added config-option: MAX_VISIBLE_TIME
Added the existing users import feature is now in the users section in the dashboard.
Tweak: hour calculation of employee is sorted on date now
Added possibility to edit specific items of a recurring pattern.
Tweak: validator ?bool? so that ?1? is also returned as true
Added possibility to import users from phpBB users table. (3.0.14 and 3.1.7)
Tweak: the texts on the buttons ?add user? and ?quick add user? have to be ?add admin? and ?quick add admin? when the super-admin is logged in, because the super-admin can only add admins.
Fixed issue with color not being saved correctly (hsv(0,0,0)), the color must be HEX format.
Tweak: Removed checkbox ?send activation mail? in settings.
Fixed bug with changing order in calendars section in dashboard.
Fixed issue with not showing all the fields in mouseover initially when more than 1 calendar is initially shown.
Fixed: when opening an event right after it was added, the optional fields where not shown.
Fixed: copy button and email button where on top of each other.
Fixed: in some cases mouseover team-member was undefined.
Added possibility to set how many days users can see events in advance. Configurable per calendar.
Fixed bug with checkbox ?others can view?.
Added lines in language files:
Lang.Prompt.Update.updateOneOrAllTitle = ‘Edit item(s)’; Lang.Prompt.Update.chooseOneOrAllText = ‘Do you want to edit this item or the whole pattern?’; Lang.Prompt.Update.thisItemBtn = ‘This item’; Lang.Prompt.Update.allItemsBtn = ‘Whole pattern?; Lang.Popup.EditRecurringEvent = ‘Edit recurring event?;

Update 35 (27-4-2016)
Added view in which you can see events by period. Showing is optional. Added config-option SHOW_CUSTOM_LISTVIEW_BUTTON.
Fixed: when having several calendars with one or more calendars with custom dropdowns, and opening a calendar without custom dropdowns after a calendar with custom dropdown the getEvents call consisted option_id. That didn?t return all the events.
Tweak: javascript indexOf gave problems with searching id in the string with calendarID?s.
Fixed: because of new way of getting events when a calendar is clicked, events from Exchange went wrong when showing more than 1 calendars at the same time.
Added lines in language files: Lang.Calendar.buttonText.CustomList = ‘custom list?;

Update 36 (14-5-2016)
Added tracking user login
Added possibility to show team member beneath the event title
Added user filter, only visible for admins
Added possibility to unassign an event (event with team member assigned)
Added change_date
Fixed: when just changed a custom dropdown value in the event edit dialog, saving and opening the event right away, the custom dropdown was not set to the correct value.
Fixed sorting of the events in the new ?period? list view.
Fixed: when ?users can see next x days? is set, the admin must see all events.
Fixed: label of the custom drop-downs was not visible.
Fixed: the count users in groups section in the dashboard also counted deleted users.
Fixed: When adding an event with custom drop-downs the values where not directly visible in the event title. Same for team member dropdown.
Fixed: In some cases the loading of calendar events failed when unpicking a calendar.
Fixed: assign to team member with inserting an event was not registered in the database.
Tweak: pdf settings (table-look or not) were not in the user settings
Tweak: with pdf export also show a private group calendar that is set to ?can view?
Tweak: adding team-member, custom dropdown values to the event title is now configurable
new lines to language files

Update 37 (27-5-2016)
Fixed: custom dropdown values were not in the 2 list views
Fixed: assigned_by has to be an integer in the insert query
Fixed: assign checkbox should only be visible in the event edit dialog when the team member field is shown.
Fixed: when dragging a user-group DD-item to the calendar is it is added as a 2-day event
Tweak: added title tag in 2 html pages
Fixed: custom dropdown filters disappeared when clicked on ?show all? calendars. Fixed: custom dropdown filter wasn?t working anymore.
Fixed: deleted users where still visible as a user group DD-item
Added possibility to show calendar name on every line in PDF export
Tweak: messages appear in the topbar now
Added lines to languagefiles

Update 38 (21-8-2016)
Added calendar buttons, filter sorting options, 12H/24H choice and extra info data (location, phone and url) to custom list view.
Added possibility to set if admin gets notifications by email only for events created by logged in -users. Default is that email are send also when user is not logged in. You can find the option in the calendar edit section in the dashboard.
Added lines to language files.
Added possibility to set the validation type for phone numbers.
Fixed a few notices in getEvents
Fixed search function
Added allday default setting possibility
Fixed: dream member was not visible in list view.
Fixed: when team member was set to empty in edit dialog it was not saved.
Fixed: Smarty deprecated error with PHP 7.
Fixed: in some cases the values set for custom dropdown where null.
Fixed issue with 2-weekly recurrent event that first 2 occurrences where only 1 week from each other.
Fixed: dditem user group could not be set to ?none? while saving a calendar.
Fixed: sorting by calendarID when having more than 10 calendars.
Fixed: when in custom list view and after sorting the items by calendarID with the sorting button, the items where not sorted by time.
Tweak: Users section, the users are sorted by last name, first name or id (USERS_SORTING) now.
Tweak: clicking on a ?goto date? button in search results uses the event_id now instead of the title. So now it also works when several items with the same title are on 1 day.
Tweak: in week view and day view now the extra info like, location is also shown for allay events.
Tweak: for standard events it is now also possible to set text color.
Tweak: you can set validation type for phone number now in config.php.
Fixed: when setting a language (that was already in the language dropdown) in the ?custom language? field, the language was not used.
Fixed: when disconnecting a recurring event and at the same time assign it to another calendar, the new calendar_id was not saved.
Fixed issue with unselecting an item form the second custom dropdownlist filter.
Fixed issue that custom dropdown could not be saved when ?show all? is selected.

Update 39 (2-10-2016)
Tweak: In the notification email the date format now also is in AM-PM format.
Fix: when ALLDAY IS DEFAULT is set, it doesn’t have to be allday when inserting an item in a time slot in the week view or day view.
Tweak: added ‘users can see next x days’ to global settings. Usable for custom list view.
Tweak: pdf and print button can be set hidden.
Added possibility to restrict users to only edit the title.
Added configurable restrictions for users concerning the custom list view.
Added search possibility to custom list view.
Tweak: email validation now uses PHP’s filter_var function.
Tweak: when editing a recurring event now also the date of the specific event is shown in the dialog.
Fixed issue with not showing error message while saving profile.
Tweak: now also pattern startdate and enddate are visible in mouseover.
Fix: validating phone number as string was not working correctly.
Fixed issue: it seemed that saving a user profile wa snot working, it was actually but the error was not showed.
Fixed bug that user group DD-items were not being showed.
new config-options:

Update 40 (27-11-2016)
Fixed: because of some notices a user couldn’t add a calendar.
Added possibility to set more than 1 team member for an event.
Added possibility to set a text color for each calendar.
Added possibility to show a logo instead of calendar name or next to the calendar name.
Added three optional custom dropdowns.
Added: optional phone number to user edit dialog.
Fixed: when adding a new item, the unassign checkbox was visible, it should be the assign checkbox.
In uploads folder you can now also put calendar_logo.png (max. height 38 px) and login_logo.png. pdf_logo.png was already longer available.
Fixed: ‘assign’ checkbox was visible in the event edit dialog, even when show_team_memberfield was off.
Fixed bug with saving a profile when birthdate was empty.
Fixed: title was not shown in weekview when the event duration was half an hour or less.
Fixed: an item was not assigned when an item was newly added with a team-member selected and assign checkbox checked.
Fixed: when en item was 0 minutes it was counted as a day in the hour calculation.
Fixed: in month view the ‘allday is default’ setting was not used properly.
Fixed issue with live notifications, you should only see others updated items.
Tweak: Nicer way to select users when editing a group.
Tweak: date format for last added events in dashboard was incorrect and added name of user who added the event.
Fixed: dropdown menu in custom list view was not translated correctly.
Fixed an encoding issue with PDF export.
Tweak: now also automatic line break in title column is possible.

Update 41 (14-12-2016)
When determining how many employees are available we have to check on groupID also.
‘Users can see next days’ (and past days) in custom list view couldn’t be set to empty and be saved.
Also added phone number as optional field to the user profile.
Fixed encoding issue in pdf export.
Fixed: in notification mail the endtime was not correct 8:00 instead of 20:00. That is when SHOW_AM_PM is false.
Fixed: 12 hour format (am/pm) in DD-item starttime or endtime (calendar edit dialog in the dashboard) was not correctly formatted. Tweak: included calendar name in the mails.
Tweak: now it is also set the options for a calendar that users only see their own assigned items.
Added possibility to export to CSV.
Fixed: after upgrading to newer jQuery, 2 date pickers were set properly anymore.
Fixed: syntax error in langES.js and langPL.js
Updated documentation

Update 42 (27-12-2016)
fixed: when dragging and dropping an event to another day/time the team member was removed from the event.
fixed: when user profile the changed values seemed not to be saved, however they were saved correctly but the refresh didn’t work as it should.
fixed: issue with showing custom list every time when user logs in, even when the config-option is false.
fixed: when showing the delete button in the events, the mouseover doesn’t disappear with mouse out event.
fixed bug in agenda list view, week start and end date were posted incorrectly.
fixed slipped in bug with adding recurring events.
fixed: 2 missing array values in search function.
fixed: user could still edit an event that was not in the alterable range.
tweak: better date format in agenda list view.
tweak: fixed position for calendar buttons left block.
added search possibility to users section in the dashboard.
added possibility to add extra date parts in the day blocks in the month view.

- Let me know what else you want to see in the hour calculation