Title: Release Notes For Version 11.5.49
Changes
Changes
Changes
Changes
Bug Fixes
For each shard of number “N”, there should be a BiskitDef UserFragmentN that is a subtype of UserFragment.
However, this was not happening.
Issue: 3729
Bug Fixes
Changes
Bug Fixes
BUGFIX: Boot sometimes fails and system does not work with message “Could not identify the request class I should build”
Bug Fixes
Resources must have a Booking BiskitDef. You cannot create one without specifying this via the UI.
However, if you use the CSV import to create a resource and do not provide the Booking BiskitDef, then you get a nasty error:
Could not create resource: NullPointerException
This is now replaced with a better message.
Issue: 3739
Changes
Disable import approval button while import in progress
Add “quarter” and “yearQuarter” pseudo date properties
Bug Fixes
BUGFIX: ShallowException on edit report and change systemWide
This doesn’t go wrong the first time you do it, but it does thereafter.
Edit a report in the report manager page, change the value of “System Wide” and save. This then gives an exception.
Issue: 3709
BUGFIX: Remove group from exported Template Group and it can’t be imported
BUGFIX: Export workflow with search action is bad if fetch from selected sources
If you have an enterprise system, and create a workflow containing a SearchWorkflowAction, where the search is configured to use a selection of source shards (rather than search from all or search from local), then the generated SQL contains an error in the final set of comments.
It shows that there was a problem generating the SQL, and that it could not produce something useful.
It had the error message:
ERROR No table name for SearchWorkflowActionElement so I can't export instances
Issue: 3735
BUGFIX: Booking formats come from current shard rather than resource home shard
BUGFIX: Export and Share buttons missing after logout/login
BUGFIX: IssueTracker exception on search for issues with null type or status
Changes
Prevent resources from being configured with iCal URL and requiring project
Rename decodeId workflow function output “id” to “idNumber”
Add code to help debug CreateVariables bug
Prevent the system user from being added to permission ‘Applies To’ tab
Allow workflow function getBookingTemplates to use repeat bookings
The workflow function getBookingTemplates finds all the templates covering either a booking, or a range of times.
If you provide it with a booking, then it refuses if that booking is repeating.
However, as of version 11.0, this is an unnecessary restriction now that repeats are handled differently.
Issue: 3730
Security Fixes
Bug Fixes
If you reduce the number of days that repeats should be expanded, and then create a new repeat booking, then the new repeat booking will be expanded out to the number of days you asked for.
But - since the system previously had expanded further, then it thinks everything is fully expanded out to a further date.
This causes some problems where expansion does not happen where it should.
Issue: 3705
Every time any Exprodo app boots or the system settings are modified, it creates an instance of the biskit “ExprodoLicence”.
These then track what the licensing limits were at each point in time.
It also tracks the version of the program installed and so it provides a good way to see when upgrades have been performed.
However, if in version 11.0.0 you try to view an ExprodoLicence that was created in 10.1 or earlier, then it generates an exception.
The message given is:
"Null value was assigned to a property of primitive type setter of
com.springsolutions.exprodo.core.domain.ExprodoLicence.licenceServerInactivityGracePeriod"
Issue: 3712
In the bakery, you can indicate which properties are required, and what the min/max value of each property is (where appropriate).
These limitations are checked after all automated properties have their values assigned.
For example, if you specify the creator of a biskit should be stored in a particular property, then that would happen before the validation is performed.
However, the validation was also being performed at an earlier stage, before these automated properties were set.
Consequently, if you specify that the creator of a biskit is to be automated, and you indicate that it is required, then creating such a biskit would fail validation because it is checked before the creator is set up.
Issue: 3713
If you configure a permission so that either the ‘Applies To’ or ‘Does Not Apply To’ tabs contain the system, then it causes mayhem.
Only root users can log in, and the root user only sees an error when trying to view the permissions page.
Issue: 3715
Calpendo only uses one cookie, and it holds the user’s session ID.
However, in an Enterprise system, each separate Calpendo shard within the federation has a different cookie name so that you can be logged in separately to each one.
This means the format for the name of the cookie has changed in version 11.0, as it now includes the shard number in the cookie name.
The name is now something like this:
session_id-407-Calpendo
Most people won’t notice this change, although it does present a problem for anybody using the same API that our desktop app uses to log in and make direct calls.
So there’s now an API call that will tell you the name of the cookie it’s using.
The scripts at https://github.com/exprodo/api have been updated to use this new API method call (and are backwards-compatible if connecting to a Calpendo without it).
Issue: 3718
Some (or possibly all) dynamic notes tabs, configured to display a waterfall of existing notes and enter a new note, give an exception when you view the tab.
Issue: 3726
If you export a workflow to SQL where the workflow:
then SQL file generation fails with an exception.
Issue: 3735
Changes
Changes
Bug Fixes
Security Fixes
When you edit a user, if you are allowed to edit the fragment for one of the shards, then you could add a role in there.
In non-Enterprise, there’s a rule that you can’t add a role to a user unless you have that role yourself.
That was not applying to setting roles on user fragments, so that if you were an admin, you could edit your own account and upgrade yourself with the root role.
Issue: 3772
Bug Fixes
This applies to both Sort Workflow Action and also Map Workflow Action.
Both of these allow you to choose a collection of biskits that they operate on.
In both cases, if you configure the workflow such that the collection they work on is empty (but not null), and you enable workflow debugger recording, then when the workflow runs, it generates an exception.
Issue: 3769
In a non-Enterprise system, when you run a list report, it will say something like:
"Found 100 bookings"
or “Found 1 bookings”
In an Enterprise system, when you run a list report that fetches data only from the local system, then it will say something like:
"Found 100 bookings from 1 systems"
or
"Found 1 bookings from 1 systems"
Whereas on a non-Enterprise system, it should say:
"Found 1 booking"
and an Enterprise system should say:
"Found 100 bookings from 1 system"
and
"Found 1 booking from 1 system"
and
"Found 1 booking from 5 systems"
Issue: 3770
Bug Fixes
Trying to add a note would give an error:
"could not initialize proxy [BiskitDef#230822] - no Session"
Issue: 3774
Suppose you have:
Then with that configuration, if you go to the user, click the Share button, and refresh the sharing to shard #2, then this sets up an infinite loop of continual sharing of the user from #1 to #2, with requests coming every second or so.
Issue: 3775
Bug Fixes
If you create a workflow with a user event and a ForEach action that is given MetaProperties.user.projects as the list to iterate over, then child actions do not know that the ForEach is providing a Project biskit.
This means that child actions cannot directly access any of the standard project properties on the biskit because it doesn’t know it’s a project.
Issue: 3776
On an enterprise system, if you edit a biskit that is already exported, and add an attachment to it, then the importing side is updated, but the attachment does not work.
This means you get a link for the attachment on the importing side, but clicking it does not download the file.
Issue: 3785
Changes
When creating conditions, there are (+) and (-) buttons, in that order, at the end of each condition to allow you to add a new condition or delete one, respectively.
In various workflow actions, there is a similar display of having a list of a variable number of items that can be added to and have items removed.
However, these display the (+) and (-) buttons the other way around.
This is now changed in workflows so that it increases consistency.
Issue: 3794
Bug Fixes
Bug Fixes
Bug Fixes
Bug Fixes
Bug Fixes
BUGFIX: Updating the order of imported booking rules fails
Suppose you export a booking rule to another shard, so that on the importing shard, it has rules from foreign shards.
Then in the rule editor, if you try to change the order of the rules by drag-and-drop, then it gives an exception.
Issue: 3826
BUGFIX: Foreign-owned custom properties count towards a starter shard’s limit
Bug Fixes
BUGFIX: Booking Display Flag not working correctly for Ephemeral bookings
BUGFIX: CustomTreePage shallow exception if click on uncached biskit
BUGFIX: Linked Booking not use available child when another child unavailable
BUGFIX: Report columns lost when biskit type being searched for is changed
BUGFIX: Linked bookings do not work unless edit/save link
BUGFIX: Upgrade from 10.1 to 11.0 fails on resource_usage_outcomes
BUGFIX: Cannot attach file more than 5MB even with larger allowed size
BUGFIX: Workflow subroutine calls forget arguments after restart
BUGFIX: Starter & Lite licence complains about linked bookings but allows them to be created and they function
BUGFIX: User “nobody” can be deleted using checked-deletion
BUGFIX: Custom message for expired accounts is ignored
BUGFIX: Upgrade from 10.1 to 11.0 fails on MySQL 8.0.35
BUGFIX: Database upgrade for 10.4.9/19/1 gives error upgrading to 11.0
BUGFIX: Booking flags on ephemeral repeats show multiple times
BUGFIX: Remove duplıcates function gives lazy initialization exception with custom user field
BUGFIX: Cannot view or edit calendar if booking is missing a required project
Suppose you configure a resource so that it does not require a project, and then create a booking for it. Then, modify the resource to indicate that it does require a project. This will mean that pre-existing bookings are missing the required project.
In this condition, the calendar does not behave very well, giving an exception when displaying the booking with missing project.
This problem affects both week view and month view.
Issue: 3838
Bug Fixes
On the system settings page’s Licence tab, there’s a button that lets you request that the licence be updated by fetching from the licence server right now.
This always fails on a production server as it does not send the required information in the request to the licence server.
Issue: 3841
Bug Fixes
When importing a project that had a reference to a previously unimported “nobody” user, then the import failed with a message “No row with the given identifier exists”.
Issue: 3845
Bug Fixes
Changes
You used to see a message like this when a biskit had been exported somewhere, but the importing side did not have a copy of the biskit:
Exported to Shard[pk=1 == 1[number=1, url=https://your.calpendo.com/, name=Main], but it does not have a copy of biskit
This has now changed to a friendlier version:
Exported to Main (1), but it does not have a copy of biskit
Bug Fixes
BUGFIX: Report Manager has extraneous vertical spaces between items
The Report Manager page shows items on multiple rows when you click on “system reports” or “personal reports”. There is:
When these did not take up the whole of the vertical space, they were being displayed with large vertical gaps to make them use all the space.
Issue: 3869
BUGFIX: Project not exportable in Enterprise when Project.owner marked required
If you configure Project.owner in the bakery so that it is marked as “required”, then trying to export any project in an Enterprise system fails.
An error is displayed saying something like “that project is a fully owned child, and so you must export the parent biskit instead”.
Issue: 3875
BUGFIX: Approving queued import can get stuck for an extremely long time
BUGFIX: Enterprise import of project with attachments fails on the attachments
This generated the error:
Unsaved transient instance when importing an Attachment
Issue: 3877
Bug Fixes
Click on a FederationImport row in a list of them, and it gives a shallow exception.
Issue: 3879
Changes
Optimisations
Bug Fixes
Bug Fixes
Bug Fixes
In 11.5.26, exporting a project will result in the ProjectResourceSettings always being imported - even if the PRS references a resource that has not been imported.
This results in the PRS referencing a non-existent resource.
In this situation, trying to use the importing shard fails after login with a message saying the server is down.
Only 11.5.26 will allow this situation to be created. In earlier and later versions, the import will ignore any PRS that reference a resources that has not been imported.
Issue: 3919
Bug Fixes
Bug Fixes
BUGFIX: Click on Define Subroutine action with abstract base type gives error
Suppose you create a new BiskitDef in the bakery, and mark it as abstract and that it does not share its table with subtypes.
(One might do this to create a grouping in the bakery, and also to provide a top-level set of properties that might be shared amongst related biskit types).
Then in the workflow manager, create a Define Subroutine action, and assign an input as a list of biskits of the type just created.
Then whenever you click on that action, it displays an error that says “X is not mapped” where “X” is the type of the BiskitDef you created.
Issue: 3942
BUGFIX: Formulaic property referencing property on specific fragment fails
BUGFIX: Resources marked as not using drag-and-drop sometimes do so
BUGFIX: Before-transaction Create database workflow event is never triggered
Suppose you create a database event, and mark it as running when something is created only, and to run in the before-transaction phase.
Then create a biskit of the same type that the event is targeted at, and the event does not run.
This bug was introduced in 11.0.4.5 and 11.5.5.
Issue: 3950
BUGFIX: Memory leak kills server when repeatedly update DB schema and reload DB config
Changes
Bug Fixes
Changes
When you create a report from the bookings search page, Calpendo generates some conditions for the things you want the report to include.
These conditions include a part that covers the start and finish date/time that you specify on the report.
The conditions used for the start/finish times were complicated, with multiple conditions working together, and not at all intuitive.
These have now been replaced with a single condition that will say something like:
Value of dateRange includes time between May 1, 2024 and May 8, 2024
This condition is then converted behind the scenes to something that handles the complexity involved with repeat bookings so that it finds all the things it should.
This makes conditions on a report much more comprehensible.
The new “includes time between” relation is also available for users to use directly in their own reports, along with the inverse “does not include time between”.
Issue: 3892
When you use the general search page and search for Resource Usage, it now defaults to using the new “Includes time between” relation to provide a default filter.
It does this over the same period as before, from 14 days ago to 14 days from now, but it now calculates when those dates are and explicitly uses them rather than using “now plus 14 days” which is not (yet) supported by the “Includes time between”.
When you use the general search page and search for Booking, this does exactly the same thing as for Resource Usage.
The old default of searching for bookings from 14 days ago to 14 days from now did not correctly find repeat bookings, whereas the new “Includes time between” does.
Issue: 3900,3925
This allows a URL like this to search for bookings between certain dates:
https://mysystem.calpendo.com/api/q/Calpendo.Booking/dateRange/includes_time_between/20250430.105900-20250614.180000/
Note that other API relations for searching for bookings do not take into account repeats and how they work.
Anybody attempting to obtain bookings or templates within a set period is encouraged to use this new includes-time-between method.
Note also that the format of the two dates for an includes-time-between in the URL is much stricter than the query API generally supports.
The syntax is like this:
/includes_time_between/yyyymmdd.hhmmss-yyyymmdd.hhmmss/
Each of the date-time values are like this:
yyyymmdd.hhmmss
but can alternatively miss out the seconds:
yyyymmdd.hhmm
or can simply be the string:
now
Issue: 3936
Bug Fixes
If you have a group report of bookings that includes any child of a linked booking, then adding a column to the report to show linkedBookingParent gives an exception.
Issue: 3851
If you generate a database dump using Calpendo 11.0.0 to 11.0.4.2, then the result cannot be loaded into MySQL.
It complains that it cannot assign a value to a generated column.
Issue: 3889
One can configure a resource in Calpendo to contain bookings that come in from an external system. For example, from a Google Calendar or other system, you can generate a URL that you can give to Calpendo, so Calpendo will create a booking to represent every item found on the Google calendar.
This worked in 10.1, but in 11.0 it fails to import anything.
Issue: 3927
If you go to Search>Search and search for Bookings, then you get some default conditions that uses the ‘includes time between’ relation.
If you run the report as-is, then it works.
If you click the Conditions button and then click the OK button (without even changing anything), then you get an error telling you that the Date accuracy is not set and it was expected to be.
Issue: 3929
If you set up an iCal import, then all the imported bookings should have a unique iCal ID stored on each booking (property name is iCalUid).
This ID is generated by the remote system that is the source of the iCal feed.
We store the ID so that when we synchronise with the remote system, we know which of the bookings in our database relates to the items in the feed.
However, the iCal unique ID was not being written to the database due to the changes that happened between 10.1 and 11.0.
This meant that the first import would work okay, but the second time it would fail.
That’s because the incoming bookings could not be matched to any pre-existing bookings, since none of them stored the iCal unique ID.
But every incoming iCal item was at the same time as the booking created when we first imported the iCal feed, and this would then generate an error as it failed a double booking rule.
Issue: 3947
When an iCal import takes place, then the idea is that the bookings in Calpendo should be a reflection of the items that exist in the remote calendar.
If the remote calendar includes historical items, then that’s what should be created in Calpendo.
If the remote calendar has items that are at the same time, then that’s what should happen in Calpendo.
However, all booking rules and limits on historical bookings were being applied to bookings imported via iCal, which doesn’t make sense.
Issue: 3948
Suppose you create a group report of bookings, and add a column for project.type.
Add a condition to show only bookings with no project.
Then clicking on the row in the group report gives an exception saying
"Cannot read properties of null"
Issue: 3949
Bug Fixes
Suppose you set up a workflow so that a database event runs before-transaction when a booking is updated, and it changes the description on the booking.
Suppose further that there’s another database event, but this one is triggered during-transaction. In this event, set up a templated text to show the old value of the booking start time and the new value.
Then if you edit a booking and change its start time, the second workflow should see the old and new value of the start time as being different. But instead, it shows them as the same, and equal to the new value.
Issue: 3964
Suppose you have a user whose account has been exported to a particular shard, but their user status on that shard is set to “Inoperative”.
This means the user account was exported without any specific request for the user to have login access.
Then in this state, if the user tries to log in, they will not be allowed to log in, but they will not be shown any reason why not.
They just see a red-bordered box with no message inside.
Issue: 3966
When a workflow is run on behalf of a particular user (eg a user modifies a biskit and it triggers a database event, or a user selects a menu option that runs a user workflow event), then that user’s access should limit what the workflow can do.
When a search workflow action specifies selected shards to search, rather than “all” or “local”, then the request is sent to all those shards regardless of the user’s access to them.
Issue: 3967
Bug Fixes
Suppose you have an Enterprise Calpendo and have a permission that allows the action “Export to Federation” for projects when the status is approved.
Further if you set up a list report of projects, and do not display the status property in the list, then when the report runs, it generates a shallow exception.
Issue: 3990
Changes
Security Fixes
Any user that can see the template calendar can click on a template, and click the “Duplicate Across Resources” option.
This happens even if permissions say the user cannot create templates.
This security hole only applies to users with access to the template calendar and only allows an existing template to be duplicated; users cannot choose anything at all about the newly created template apart from the resource it applies to.
No other changes to data are in any way affected by this - it’s limited to duplicating templates across resources.
Issue: 3908
Bug Fixes
BUGFIX: High volume of permissions could crash booking tooltip request
BUGFIX: hibernate.connection.url set incorrectly in sample-hibernate-mariadb.cfg.xml
BUGFIX: Linked booking link child property setting disappears
If you set a fixed value for a property on the “child properties” tab of a linked booking link, then that value will usually (although not always) be lost by the user interface.
When you first set up such a property, then it will be saved properly, even if after the save the value is not displayed.
However, from that point, if you edit the linked booking link again, then the value would be lost.
Issue: 3976
BUGFIX: Custom search page with filter for date-time property gives exception
BUGFIX: Remove lastRepeat columns from list reports
BUGFIX: Error in standard “Exception to email” workflow
BUGFIX: Show error when report or permission that references unknown props is displayed
This is here in particular because version 11.0 has removed properties Booking.lastRepeat and Template.lastRepeat, with no alternative properties to replace them.
This is a breaking change, and any reports that referenced those properties will no longer work.
Consequently, when you now try to look at such a report or permission, it will show an error telling you about the properties it does not recognise.
Issue: 3981
BUGFIX: Bakery allows you to create a new BiskitDef with clashing biskit type
BUGFIX: Exception displayed on calendar when project has an associated user that does not exist
BUGFIX: Get nasty error if an unimport request fails due to being referenced
In an Enterprise system, if you try to unshare a user that has been shared to a shard where it is referenced, then you get an unfriendly error message instead of a good one.
Issue: 4013
BUGFIX: Enterprise Query API calls ignore any conditions set in the URL
BUGFIX: Enterprise Query API fails “&shards=all” if not a user on all shards
Bug Fixes
If you set up a search action in a workflow, and the search conditions use something output earlier in the workflow, then when the search runs, it will be as if that thing from earlier in the workflow was null.
Effectively, the whole context of earlier workflow output was not available at runtime to the search conditions.
This bug was introduced in version 11.5.30
Issue: 4018
The problem is that if you search for something (eg bookings with a project), and then list extract the projects, you will find the projects are all shallow.
If you try to get properties, they will all appear null.
Issue: 4020
Changes
Add more debug logging to debug attachment downloading in Enterprise
Change Enterprise tools wording when user account exists mismatches
Prevent updates to exported biskits that make them not exportable
Enterprise - Show shard number in permissions & rule pages for imported items
Prevent custom repeat booking/template from being created or updated
Check whether allow Enterprise unimport on receipt of request
When you ask for something to be unshared from one or more shards, those remote shards check whether the biskit being unshared is referenced or not. If it is referenced, then it does not do the unimport.
However, the check for whether it is referenced is done only when the unimport is attempted. But if there is something already queued, the the unimport request will also be queued, and so the check for any references will not be done until later, when somebody clears the queue.
This means the person doing the unshare will think it has gone ahead okay, and can be oblivious to a problem that may exist on the importing side.
Issue: 4104
Security Fixes
Bug Fixes
BUGFIX: API query fails to find a match when a search condition string value includes a space
If an API query is submitted to find a biskit that matches a specified string value for one of its properties, then no match is found if the string specified contains a space.
For example, an API query to search for a bookable Resource whose name contains a space will not find a match even if you get the name right in the condition.
Issue: 3921
BUGFIX: Before transaction workflow event overwrites old value of a property
Suppose you set up a workflow so that a database event runs before-transaction when a booking is updated, and it changes the description on the booking.
Suppose further that there’s another database event, but this one is triggered during-transaction. In this event, set up a templated text to show the old value of the booking start time and the new value.
Then if you edit a booking and change its start time, the second workflow should see the old and new value of the start time as being different. But instead, it shows them as the same, and equal to the new value.
Issue: 3964
BUGFIX: Conditions in a URL that take a DateRange value only accept a prefix of ‘R’ but should also accept ‘r’
The documentation here: https://docs.exprodo.com/railroad/conditions-url-11.0.4.html describes how you can use a link directly to a search page, and put conditions in the URL that will choose what the search will find.
For example:
https://demo.calpendo.com/#search&searchType=Calpendo.Booking&action=view&condition=dateRange.start/includes_time_between/R20240528.120000-20240528.230000/to-the/hour
This query is perfectly valid, and works. The documentation indicates that when putting a DateRange value in the URL, it must be prefixed with ‘R’ or ‘r’.
In the above example, it appears as: R20240528.120000-20240528.230000
However, while ‘r’ should be accepted, it isn’t. Only ‘R’ works. If you use ‘r’, then it causes an exception.
Issue: 3974
BUGFIX: Annual Repeat Bookings are assigned incorrect dates beyond the second instance
BUGFIX: Search for references to property sometimes gives exception with illegal report
Suppose:
Then when you click on the property “x” in the bakery and search for references to it, you get an exception.
Issue: 3984
BUGFIX: Specifying an invalid API resource looks like server down
BUGFIX: Errors sent from API give illegal content type
BUGFIX: Using API in browser shows raw HTML instead of interpreting it as HTML
BUGFIX: Downloading Enterprise foreign attachments fails if not already logged in
BUGFIX: Cancelling last non-ephemeral repeat instance (‘This Item’) cancels all subsequent instances as well
BUGFIX: No warning popup when booking inside a warning template
BUGFIX: Setting booking rule to “suggest retry as tentative/requested” doesn’t result in expected suggestion popup
BUGFIX: Bookings rejected by a workflow rule did not generate exception
BUGFIX: Repeat expansion rejected by a booking rule prevented any expansion
Bookings that repeat have a certain number of booking instances expanded and stored in the database. This is set to 90 days by default.
Suppose a booking rule prevents a booking being created on some day in the future.
This might be a holiday rule or anything else that rejects a future booking.
Then when you create a booking, if the day which would be rejected by the rule is WITHIN the 90 day period, the booking would be outright rejected as breaking the rule.
This is not ideal, but is how the system has always behaved, and we are accepting this for now.
Suppose then that the day which would be rejected by the rule is OUTSIDE the 90 day period.
Then it’s the job of the “Repeatable Handler” to check every day to see if there are repeat bookings that need to have another day’s booking expanded and stored in the database.
If that happened, and the booking it tried to create was rejected by a rule, then this would generate an exception and no changes would be written out.
This isn’t right because this booking would never be able to exist beyond this one day that the rule disallows.
The behaviour now is that on the day in question, the booking will be created, but it will have a status of DENIED.
A further issue with this behaviour exists on upgrading from 10.1 to 11.0. In this case, the upgrade procedure which runs at boot time does not expand the repeat instances. Instead, this expansion happens after the Calpendo boot has completed. However, any booking for which any of its repeat instances (within the 90 day period) are rejected by a rule will result in that booking not being expanded at all - not even before the day that is rejected.
The expected behaviour here is that those bookings that are rejected are assigned a status of DENIED, and all others would be expanded as normal.
Issue: 4043
BUGFIX: Repeat expansion could set a whole sequence to denied when it should not
BUGFIX: Errors sent from API set the HTTP return status code to 200, which suggests no error
BUGFIX: RepeatableHandler “update” system event is badly formatted, confusing and misleading
BUGFIX: Permission editor gives false-positive errors about unknown properties
BUGFIX: Database stored functions ‘formatpk’ and ‘parsepk’ get timezone wrong
BUGFIX: Change finish time on last instance of a repeat gives exception
Suppose you create a repeat booking and give it a finish date, so that it does not repeat forever.
Then if you edit the last instance of the repeat and change the finish time, then you get an exception that says:
"IndexOutOfBoundsException: Index -1 out of bounds for length 0"
Issue: 4060
BUGFIX: Edit ephemeral afternoon daily repeat booking this-item and non-ephemeral booking not created next day
If you create a daily repeating booking that starts after noon, and then edit the description of any one of the repeat instances after the period of expansion in the database (90 days from today by default), then it does not store a new instance of the repeating booking a day later, which it should.
Issue: 4061
BUGFIX: Ephemeral bookings sometimes do not display in the calendar
BUGFIX: Existence of before-transaction db event causes aborted cancellation to be persisted
BUGFIX: Location applicability is ignored on rules
BUGFIX: Edit description of last ephemeral THIS-ITEM and previous ephemeral is not created
Suppose:
Then it will correctly store a booking in the database to represent this instance.
However, it should also create bookings in the database for all previous ephemeral bookings, and it did not do this.
Issue: 4066
BUGFIX: Exception on change repeat so previously cancelled bookings now needed
Suppose you have a repeat booking, and you then modify the repeat in such a way that some repeat instances are no longer needed, and so are cancelled.
Then modify the repeat again so that some or all of those cancelled instances are required again. That is, they must be “uncancelled”.
This situation was not handled correctly, and it tried to save the uncancelled bookings with a null status, which is not allowed.
Issue: 4071
BUGFIX: Enterprise cannot unshare a project
BUGFIX: Approve repeat booking also approves cancelled and denied instances
Suppose you:
Then all the repeat instances are approved.
This means that the instances that are not wanted (because it’s repeating every 2 days) are also approved, and so they look like that are wanted, even though the repeat still says every 2 days.
Issue: 4075
BUGFIX: You can approve a repeat booking instance that is cancelled because the repeat says it should not exist
BUGFIX: Uncancelling repeat booking ALL ITEMS only uncancels one instance
BUGFIX: Creating a new booking allowed you to select “custom” repeat type
Custom repeat types are partially implemented. This is a type where you have multiple bookings that are considered part of the same repeat sequence, but without a defined pattern to the dates that the repeats occur on.
During an upgrade from 10.1 to 11.0, any repeat bookings where the whole sequence is in the past will have lost the information about what sort of repeat it was.
Consequently, during the upgrade they are converted to a repeating sequence with “Custom” repeat type.
This is currently the only way to create such repeats as they are not fully implemented.
So when creating a new booking or template, the repeat types drop-down lists “Custom”, but it is greyed out and cannot be selected.
Issue: 4078
BUGFIX: Custom repeat type is selectable when editing existing booking
A custom repeat type should ONLY be selectable when:
However, pre-existing bookings which were either not repeating, or were repeating with a type that was not custom could be edited to make them custom repeats. This is not supported.
Issue: 4080
BUGFIX: Choose reason for cancellation and it did not notice (if on subtab)
BUGFIX: Change repeat booking description ALL ITEMS gives shallow exception with status on subtab
BUGFIX: Change repeat booking description ALL ITEMS gives shallow exception with formulaic property
BUGFIX: Edit a repeat booking instance and “Cancelled” does not appear in the status drop-down
BUGFIX: User can change the resource of any booking from a repeat sequence
BUGFIX: Error displayed after editing a non-ephemeral booking in the future and select ‘This and Later’ option
BUGFIX: Created booking appears to be ephemeral via ‘Copy to Clipboard’
BUGFIX: Cut/paste some workflow actions gives EntityNotFoundException on save
BUGFIX: Cannot save User BiskitDef with property that references a User
BUGFIX: Enterprise user session loaned to other shard not marked as borrowed
BUGFIX: Unsharing Enterprise project with referenced fragment gives bad error
If you have a biskit that references a fragment of an imported biskit, and then try to unshare that biskit, the result is a horrible error message.
This commit checks for references to the fragments so that we can provide a better message. Previously we only check for references to the main biskit.
Issue: 4096
BUGFIX: Data loss if edit a biskit referencing a non-enumerable biskit value
BUGFIX: Allow Zombie Enterprise imports to be denied
BUGFIX: Allow user to log in if menu references non-existent user workflow event
It should not be possible to get into a state whereby a menu references a workflow event that does not exist, however this is possible using an Enterprise system.
If you get into such a state, and your menu has such a bad reference, then you were not able to log in.
Issue: 4101
Changes
Suppose:
then since you can’t log in to all the shards to which the workflow has been exported, you cannot check whether the workflow is referenced on those shards.
Consequently, you will now be refused the ability to update a workflow in such a way that removes any of the above events/actions, or that deletes a workflow if you cannot log in to any shard to which the workflow has been shared.
Issue: 4114
Bug Fixes
BUGFIX: Allow user to log in if menu references non-existent user workflow event
It should not be possible to get into a state whereby a menu references a workflow event that does not exist, however this is possible using an Enterprise system.
If you get into such a state, and your menu has such a bad reference, then you were not able to log in.
Issue: 4101
BUGFIX: Reports with holes in the list of columns cannot be run and break show-references
BUGFIX: Non-Enterprise search workflow action upgraded from 11.0 gives exception
BUGFIX: Account status page sometimes shows a message with missing spaces
When there’s a problem with an account being active on different shards from what another shard thinks, then you can see an error message like this:
Account is active on more shards than shard 34 thinks. Active on shards 1, 331 and 409 while shard 34 thinks the account is active onshard 1
The problem is the “onshard” at the end, which should say “on shard”.
Issue: 4108
BUGFIX: BiskitDef does not have versioning set up
Some BiskitDefs are configured to specify a property that stores a version number.
The BiskitDef for BiskitDef itself does have an integer property for this purpose, called “version”.
However, it was not set up as the property to store the version number for a BiskitDef.
This means that there was no protection against somebody editing an out-of-date BiskitDef.
Issue: 4109
BUGFIX: References to a Workflow do not show menus and other workflows
When you have a menu that references a UserWorkflowEvent defined by the workflow, nothing looks for references to that event, so the menu is not found.
A workflow is referenced by every event and action within it. To avoid noise, references from workflows to a workflow were ignored. But this did not take into account when an action has a reference to something in another workflow. For example:
BUGFIX: Updating a workflow to remove parts of it that are referenced is not handled well
Changes
Every time there is an export from one shard to another, the importing side records a FederationImportBatch. This is what the federation import queue page looks for.
Each batch contains one or more child items for the import or unimport of a biskit.
Each of those children specify whether they are an import or an unimport.
However, we do not allow a single batch to mix imports and unimports.
So we now have a property “importAction” on the batch items to indicate whether it contains imports or unimports.
Issue: 4154
Optimisations
Bug Fixes
BUGFIX: 11.0 upgrade does not warn about conditions that reference lastRepeat
The lastRepeat property has been removed from Booking and Template in 11.0.
Some conditions are automatically modified when the reference the lastRepeat property, but not all.
There was already an upgrade script to make sure there was a warning generated during the upgrade for any remaining condition that referenced lastRepeat, but it never ran because it was misconfigured.
Issue: 4120
BUGFIX: Report with lastRepeat columns fails after upgrade from 11.0
In 10.1, there are properties Booking.lastRepeat and Template.lastRepeat that do not exist in 11.0.
If you have a report which has a column referencing one of those properties, and it is not the last column in the report, then upgrading from 10.1 to 11.0 produces a report that gives errors when you open it.
Specifically, locate the report in the report manager page, and then click on either “Open Report” or “Run Report”, and it gives an exception.
Issue: 4121
BUGFIX: Enterprise scheduled report is blank if getting data from multiple shards (even if all the data is held on the home shard)
BUGFIX: Cannot initialise system identity when upgrading an already-expired licence system from 10.1 to 11.0
When a Calpendo’s licence has expired, and gone beyond its grace period, trying to use it will instead display a “Licence Reset” page.
When a Calpendo has just been upgraded from version 10.1 to 11.0, then the “Licence Reset” page will show as well. This is because it will need to be assigned a “system identity”. This is used with the new licence server so that each system can have their licences automatically updated each year, rather than requiring a manual change to input the new licence.
However, if an already-expired system is upgraded, then you could not use the licence reset page to assign a system identity. Without a licence and without a system identity, recovery from this would be messy.
So now, the system reset page will allow you to set the system identity when the licence has expired. This allows for upgrades from 10.1 (which have no system identity) to work properly.
Issue: 4124,4125
BUGFIX: CustomTreePage error when multiple items start with the same string
Suppose:
Then when you click on any of the biskits below the longer name, you get a message pop-up for a few seconds in blue that says:
"Could not parse requested node identity (ignored)"
Issue: 4127
BUGFIX: Click on any biskit and the “Delete” button is always greyed out
This was a problem with the changes to the way references to biskits were calculated, which left all biskits as being considered undeletable even when they were unreferenced and deletable.
Issue: 4128
BUGFIX: Linked booking sometimes fails when one child breaks rules, others ok
Suppose you have linked bookings set up so that the creation of a booking for a parent resource will create a booking for exactly one child booking, but from a selection of more than one resource.
Then if you make a parent booking and the first child it tries to create fails because it breaks a rule, it means that it doesn’t even try to make a booking for another child, so the parent gets refused.
Issue: 4129
BUGFIX: Enterprise service orders should live only in the shard that owns the service
BUGFIX: Searching for references ignored anything referenced in conditions
If a permission has a condition that references a particular ResourceGroup, such as:
self member of fixed MyResourceGroup
Then when you go to the MyResourceGroup and look for references to it, it would not show the permission as referencing it.
This was true of all flavours of conditions.
Issue: 4132
BUGFIX: Boolean properties don’t work when displayed as a check box
If you configure a layout to display a boolean property with a checkbox (rather than radio buttons or a list box), then it does not display the correct value and does not let you change the value.
Issue: 4133
BUGFIX: Login page fails to display with msg “Could not initialize proxy - no Session”
BUGFIX: Edit the schedule for a report and the start time-of-day is ignored
Create or edit a report in the report manager, and the time-of-day on the schedule’s “When” tab always reverts to midnight, regardless of what time you choose.
Issue: 4138
BUGFIX: Enterprise import can fail when two users imported with same project
Suppose two users are imported at the same time, when both users are a member of the same project, and that project has not yet been imported.
Then in this case, the import would fail with an error like this:
FetchNotFoundException during FederationImportApprovalRequest: Entity Calpendo.Project
with identifier value 633366068069377
does not exist
Issue: 4139
BUGFIX: Record a reason why each Enterprise import batch was created
BUGFIX: Enterprise exceptions from foreign shards don’t log foreign details
BUGFIX: Persistence exception on import does not update import status
When there’s a failure to perform an import, this would most normally generate a HibernateException. If there was one, then we would mark the batch as having a status of ZOMBIE.
However, there are some things that can go wrong that are thrown as a PersistenceException, which we did not catch.
This meant that these errors would not result in the import status being changed to ZOMBIE as it should.
Issue: 4142
BUGFIX: Guaranteed delivery of messages between Enterprise shards was not working
BUGFIX: Infinite loop if Enterprise requests implies communications failure
Suppose a particular request is consistently handled badly, such that it results in what appears to be a communications failure to another shard, while other messages are able to get through to the shard without a problem.
Then in this case, our general practice of resending failed messages would result in an infinite loop.
This behaviour is now modified such that if we see a particular request failing many times, and other messages are able to get through to the shard over the same time period, then we will assume the request is somehow bad, and should be dropped.
This means the notion of “guaranteed delivery” is weakened for those cases where it appears impossible to deliver a particular request.
Issue: 4144
BUGFIX: Federation Import Queue page cannot handle large number of queued items
BUGFIX: Two “booted” messages were sent to other shards on each boot
BUGFIX: Import requests sent to ourselves on reconnecting to a shard
BUGFIX: Importing a biskit that might be a child generates duplicate requests
BUGFIX: Users & Projects changed by export written to database twice
Suppose you have a user or project that has been exported, and then somebody makes a change to it.
Then Calpendo will see that it has changed, and that it should be re-exported to all previous importers. So it sends an import request to all the importers.
The importers send a reply that includes a copy of the fragments so that we can update our copy if their fragments have changed.
The exporter checks the response to see whether the fragment has changed, and if so, then it writes the new value of the fragmented biskit to the database.
However, the write to the database happened twice rather than just once.
Issue: 4151
BUGFIX: Example services not compatible with Enterprise
BUGFIX: Cannot tell which shard an Enterprise service is for in “Available services” page
Bug Fixes
We can configure the system so that users that are approved anywhere will be approved here, and users that are requested are automatically approved.
Whenever a user is re-exported, and a shard re-imports the user, this triggers the resetting of a user status, depending on the the above-mentioned settings.
In particular, if a user is imported and:
This happened both on import and re-rimport. But it doesn’t feel like the right thing to do to change a user status on a re-import, and so is now only done on a first time import.
Issue: 4158
Suppose:
Then this leads to an infinite loop of the imports being done, sent out to previous importers of the user who send a message back to the exporter, which will re-send an export message.
The infinite loop will flip-flop between the user status specified in each of the batches A and B.
Issue: 4160
Changes
Bug Fixes
BUGFIX: Change of Repeat.start from date to datetime causes workflow warnings
BUGFIX: Search for Calpendo Licence gives usedLinkedBookingLinks error
Search for “Calpendo Licence”, and either show a list report or a group report which includes the new property “usedLinkedBookingLinks”, and you get an error:
IllegalArgumentException during GroupSearchRequest: org.hibernate.QueryException: could not resolve property: usedLinkedBookingLinks of: Calpendo.CalpendoLicence
This was a bug introduced in 11.0.7 due to a change to allow linked bookings to be added to a Calpendo Starter licence.
This change had an error in it that meant that Calpendo Licence was not properly defined, and any attempt to access the new usedLinkedBookingLinks property would fail.
Issue: 4162
BUGFIX: New user and project fragments were not assigned any default values
BUGFIX: New user exported in Enterprise did not send fragments everywhere
The changes in 11.5.39 to avoid fragments being sent everywhere repeatedly in an infinite loop were a little too strong.
When a user is first exported to another shard for the first time, then the importing shard’s new fragment is not sent to other shards.
It should go to the exporting shard, and also to any other shards that import it.
Issue: 4166
BUGFIX: ConcurrentModificationException sometimes seen while importing biskits
Bug Fixes
If you edit and save an imported user, where that users owns a project that has not been exported to the user’s home shard, then saving the user would generate an error.
Issue: 4168
Suppose you have templates in an 11.5.39 or earlier system, and upgrade to 11.5.40.
If you then look at the bookings calendar and it includes resources that have any of those templates, an error is displayed saying “Failed to load bookings…”
Issue: 4169
Suppose a biskit is shared from one shard to another.
Then on the importing side, when you view the biskit, the “Delete” button would be greyed out or enabled according to erroneous logic, so that it might be disabled when it should be enabled.
Issue: 4170
When you look at a biskit, and click the references button, then it will show you which shard has a reference from which type of biskit, and via which property.
However, when multiple shards have references from the same type of biskit and same property name, only the information from one shard would be shown.
Issue: 4172
Bug Fixes
The database upgrade for issue 4169 should have checked that it was running on a Calpendo system, since the change was only relevant to Calpendo.
However, it did not do this, and so upgrades would complain as it tried to look for content inside a Calpendo-only table.
Issue: 4178
If you have templates and then upgrade to 11.5.40 or 11.5.41, then you get this error in the calendar:
Null value was assigned to a property of primitive type setter of com.springsolutions.calpendo.domain.template.TemplateTAM.equalsLocalProjectType
Issue: 4192
Bug Fixes
BUGFIX: Exporting project can fail with message “UserIdentity is not mapped [select count(*) from UserIdentity where id = 0]”
Changes
Prevent linked bookings using linkedBookingParent as link to child
The property Booking.linkedBookingParent exists so that a child linked booking knows who its parent booking is.
You may also provide a property that allows a parent booking to reference the child.
This ought to be a custom property that you add for the purpose, as we do not provide a property for it since it necessarily implies that the parent has only a single child, which may not be true.
However, the UI allowed the property linkedBookingParent to be used for the link from parent to child as well as the link from child to parent.
This is confusing and so is now prevented.
Issue: 3645,3847
Sort list reports using the sort order defined in the bakery
Display 3 letters for the month in the navigator above the calendar instead of full month name
As you clicked the arrows to move forwards or backwards a week or month, then changing from one month to another would mean the buttons would change their location because of the variable month name length.
Changing this to a constant three letters beings better stability to button locations.
Issue: 3864
Add support for a number of templates and rules in the licence to override standard starter licence limits
Currently the starter licence limits the number of templates to four and the number of rules to four, while a premium licence allows an unlimited number.
We can now alter a licence so that additional templates and rules can be added to a starter licence.
Issue: 3958
Append trailing slash to system settings Email Base URL if one not provided when configure new system
The Emailed Base URL system setting can be used by workflows to generate a URL that, when accessed, will result in a call back to Calpendo.
However, if this doesn’t have a trailing slash, and workflows don’t check for and append a slash, then URLs generated by a workflow will not work.
When you configure the initial screen for a Calpendo, it asks you for the base URL, and this now has a slash appended automatically if there isn’t already one there.
Issue: 4059
Add id to buttons and text boxes in login and new user request pages
Make the error message from linked bookings more user friendly
When a linked booking parent cannot be created or updated because an insufficient number of child linked bookings could be created, then the error message presented to the user was a bit confusing.
This language has now been made clearer.
Issue: 4175
Add licence type (full/lite/starter etc) to licence server requests
Add scripts for exporting attachments to the INSTALL directory
The Calpendo release now includes a new directory in the archive in INSTALL/export_exprodo_events for exporting attachments programmatically from a script.
Issue: 4208
Make all biskit type columns use ascii char set and related collation
Some tables store a column that references a biskit type. There can be one of two reasons for this:
In all cases, we have always enforced the requirement that the text used for a biskit type matches a simple expression that means it consists solely of upper and lower case letters, digits and the underscore.
In particular, it cannot have accented characters or any exotic non-ASCII characters.
Each string-valued column stored in the database has associated with it a character set used by that column, and also a collation that specifies how to order and compare values.
The data stored within these columns is always compatible with the database character set known as ‘ascii’, which reflects the ASCII characters.
However, the actual character set defined was left to be the default for the database. Since MySQL has changed the default in recent versions, it means that you can have a different character set being used for some of these columns than others.
The 11.0 upgrade introduces changes to the way repeats are handled.
In particular, it creates a new “repeats” table which stores a column for a biskit type, and as a part of the upgrade, values stored in this column are compared to the ‘cls’ column in the bookings and templates column.
However, since the repeats table is new, it was being assigned the new default character set, and the bookings and templates tables being old meant they could use the old default character set. This caused a failure during the upgrade when run on a MySQL database.
So now we modify all columns that store a biskit type so that they are explicitly declared with the ‘ascii’ character set, along with the default collation for that character set, which is ‘ascii_general_ci’.
Issue: 4209
Security Fixes
On every system, clicking the “Register New User” button results in a list of all registered users (their numerical id number, login name and real name) being sent to the browser.
On all Calpendo systems, it also sends the id number, project code and name of all projects.
This user and project information is not usually required, and should not be available before a user has logged in. This represents a data breach since it is possible to enumerate all users and projects on an enterprise system, and all projects on any Calpendo.
If users reference any other biskits, then all instances of whatever type is referenced is also sent to the browser. This is here so that a user that self-registers can select their user type or department etc.
However, if there were any sets of biskits attached to a user, for example their training records, then training record id numbers would also be sent, plus any name if they had one.
Clicking the “Register New User” button results in the browser being sent some information about all users in the system.
This includes their numerical ID number (which encodes the date/time the user was created), their login name and their real name.
The ID number, project code and name of all projects was also sent to the browser.
An attacker could use this to see the names of all users on Calpendo and the date on which they became a user.
When a user self-registers, there can be drop-downs, like the one that allows them to select their own user type. For this to work, the name and ID number for every user type must be sent to the browser.
This was looking for any type of biskit referenced by a user, and sending the name and ID number of every biskit of that type.
The fix specifically prevents user and project information from being included.
Further, we exclude any biskit type for which the user “nobody” does not have EXISTS permission on every instance of that biskit type. For example, if a user were given a property that referenced a resource, then the name and ID of all resources would be sent to the browser. But if just one resource has a permission that prevents user “nobody” from being able to know it exists, then no resources would be sent to the server.
Issue: 4294
Bug Fixes
BUGFIX: Template prevents bookings 45 minutes before template start
Create a template rejecting everyone. Set it to start at 9:00.
On the calendar, if you click on any quarter-hour from 08:15, the templat rejects you outright whereas one might expect it would allow you to make a booking 08:15-09:00.
Issue: 3710
BUGFIX: Booking fields that are filtered don’t filter on first click after browser refresh
BUGFIX: Booking references from other biskits do not display name format specified in bakery
If you have a biskit with a booking field on it (ie that links to a booking and also has the little calendar icon next to it to take you straight to the calendar) then the text used for the link is:
Booking ID/start date/start time/finish time
This should be whatever is specified in the bakery as the name property or the format definition for the biskit.
Issue: 3781
BUGFIX: %dateRange% format always repeats the date even for bookings that start and end on the same day
The dateRange property on a booking is correctly displayed as:
[dateRange.start.date] [dateRange.start.time]-[dateRange.finish.time]
Except when the booking stretches over more than one day, in which case it is correctly displayed as:
[dateRange.start.date] [dateRange.start.time]- [dateRange.finish.date] [dateRange.finish.time]
However if you use %dateRange% in the format or when specifying what to show in bookings in the Calendar view, it always uses the version that repeats the date, even for bookings that start and end on the same day.
Issue: 3782
BUGFIX: Columns displayed in a list report reset to defaults after item in list is edited
BUGFIX: Workflow Search Action using a ‘Not All’ condition returns incorrect results
When a Workflow Search Action includes a ‘Not All’ condition on the search, then the results it finds are incorrect.
Issue: 3823
BUGFIX: Display is blank when viewing linked booking null parent-to-child prop
BUGFIX: Reports with null conditions cause multiple failures
Reports can have no conditions, but what that should mean is that the report has conditions that say that are empty rather than the conditions being null.
No report should ever have null for its conditions, although it has been observed.
When this happens, it resulted in an error running the report.
Issue: 3858
BUGFIX: Searching for Calpendo Config generates an IllegalArgumentException
If you try to search for Calpendo Config, then you get an error:
Failed to fetch data: could not extract ResultSet
Issue: 3909
BUGFIX: Holiday dates import not accessible to calculateWorkingHours workflow function
If you use the CSV file import utility to import holiday dates, then the workflow function calculateWorkingHours ignores the imported holiday dates.
Issue: 3923
BUGFIX: Custom Tree Page with grouping by null-valued biskit gives exception
When using a resource biskit for dynamic sub nodes on a custom tree page, if one of the resources has no location and location is used as a property to group biskits the page can’t load through menu with an error.
Issue: 3932
BUGFIX: Resource sort order ignored in Calendar-by-location
BUGFIX: Workflow sort action fails if the list of biskits contains a null value
BUGFIX: When multiple template messages should be displayed, some may not be
If you have a message on a template group, and also have a message on the template directly in the template calendar, then at times when both messages should show, only one does show.
Issue: 4031
BUGFIX: Default time when creating booking is weird when using predefined time slots
BUGFIX: Breaking booking rule on linked booking of one instance of a repeat prevents further expansion of the repeat
BUGFIX: View history of a linked booking and click on one of past versions gives an exception
BUGFIX: Click on biskit can show error saying possible permissions problem
Some permissions could result in an error being displayed incorrectly when you click on a biskit.
Issue: 4099
BUGFIX: Reports with missing columns or bad conditions generate exceptions when run
BUGFIX: Information Pages module does not set up pages in a hierarchy
Calpendo has a module called “Information Pages” which when loaded allows you to display pages about your facility.
This allows you to specify that a page has a parent and children, so that the pages display in a hierarchy using a tree structure.
However, it would always display as a flag list instead of in a tree.
Issue: 4118
BUGFIX: Cannot disable rule when over limit by more than 1 in Calpendo Starter
A starter licence allows only a limited number of bookings rules to be used.
If you are over the limit (perhaps because your licence changed from a premium system to a starter), and try to edit a rule to make it disabled, then you are not able to.
It gives a message “Failed to save Interval Rule” without any more information.
Issue: 4137
BUGFIX: Edit the schedule for a report and the start time-of-day is ignored
BUGFIX: Booking repeat displays badly if the booking layout assigns full detail tab to it
BUGFIX: Booking history fails when EXISTS permission depends on type
BUGFIX: Cannot delete bookmarks (error message says it doesn’t exist)
If you try to delete any bookmark that should be deletable, then it fails with a message to say the bookmark doesn’t exist.
Issue: 4190
BUGFIX: Workflow action displays in red box on history page
When a workflow modifies some data, the history page shows which workflow action made the change.
This is displayed on the history page in a red box, which is normally used to indicate an error.
The red box no longer displays in this context.
Issue: 4193
BUGFIX: Click on group report row shows nothing if time condition to-the-hour, minute or second
Suppose you create a group report of bookings, and add a condition of the form “dateRange.start equals DATE-TIME to the HOUR”.
Then, if the report finds any bookings, click on any of the rows displayed in the group report and it doesn’t find the bookings in that group, and so does not display them.
The same happens if you use a condition that is to-the-minute or to-the-second.
Issue: 4194
BUGFIX: Upgrade directly from 9.0.67 to 11.0 fails
BUGFIX: Tooltip on LinkedBookingLink.cancellationReason does not say when reason will be used
The tooltip on the cancellation reason on a Linked Booking Link did not make it clear when exactly the provided reason would be used, and it wasn’t otherwise obvious.
The tooltip has now been clarified.
Issue: 4201
BUGFIX: Validation errors in linked booking links are not displayed
If a linked booking link is configured to reference a property that has been deleted, then this gives an error.
However, the UI does not tell you what the error really is.
Issue: 4202
BUGFIX: Read-only calendar does not handle non-Latin characters properly
A read-only calendar displays a non-interactive view of bookings.
If any of the resource names or bookings contain accented characters, then the calendar does not display properly.
Issue: 4205
BUGFIX: Read-only calendar in systems created in 10.1 cannot cope with formatted resource IDs
Any Calpendo that was first created in 10.0 or later has a default workflow that can display an anonymously-accessed read-only non-interactive calendar of bookings. This is disabled by default.
The workflow will parse arguments in a URL so that you can, amongst other things, define the resources whose bookings should be displayed.
If you specify the resource IDs using a formatted ID (as is displayed in the Calpendo user interface) then the calendar did not display.
Issue: 4206
BUGFIX: Read-only calendar sometimes fails when specify large numeric value for resource ID
The read-only bookings calendar does not display when one of the resources being displayed has an ID greater than 2,147,483,647 and the user that is the source of displayed styles has no user setting for the resource.
Issue: 4207
BUGFIX: JSON error reported when viewing history of booking modified in 11.0.7
BUGFIX: LazyInitializationException updating booking after having modified workflow with BookingRuleWorkflowEvent
If you modify a workflow that contains a BookingRuleWorkflowEvent, then any time you create or update a booking thereafter you get an exception and are prevented from making the change.
The only work-around is to restart Tomcat after updating any workflow with a BookingRuleWorkflowEvent.
Issue: 4257
BUGFIX: “could not initialize proxy” error when adding a note to a project
BUGFIX: Configure notes in layout and then view layout shows misconfigured
BUGFIX: Booking reminders partially broken - wrong content and tries to send emails to email address “null”
BUGFIX: SQL Export of reports & timed workflow events broke start & finish
BUGFIX: TimedEvents don’t work if the start date/time is null and users don’t see the start date/time
BUGFIX: Permissions for repeat templates & bookings are overly restrictive
The change to the way repeats work in 11.0 completely changed the way bookings and templates handle repeats. One of the consequences of this is that a repeat is now a separate biskit that can be queried and modified where before it could be.
That’s because repeats used to exist only as an integral part of the booking or template that owned it, and was stored in the same database table row as the booking or template.
This meant that there was only ever one row for a repeat booking, and so all instances in a sequence had to be identical.
This is now different, and it means the repeat information now lives in a table of its own.
When you edit a repeat booking in such a way that it required a change to the repeat as well as the booking, then it was checking that you had permission to change the repeat as well as that you had permission to change the booking.
However, this doesn’t and can’t work because the repeat does not have enough context to evaluate whether you should be allowed to modify it.
For example, there is no permission one could express directly for the repeat to indicate that the resource’s manager user group should be permitted to modify the repeat because the repeat does not store a reference to the booking.
So now when you modify a repeat booking, it will only check permissions for changing the booking. If you want to limit what can be done to repeats, then create a permission on the booking or template to do so.
Issue: 4280
BUGFIX: User names with a period in them are rejected
BUGFIX: Boot fails every 10,000 boots with complaint about ApproxateDate.year not being saved by its DTO
At boot time, we run automated tests to make sure that any classes that use a data transfer object (DTO) to transport their data over the network are well defined.
Occasionally, when there’s a check on the biskit ApproximateDate’s year, this will fail complaining that it put in zero and got out null with this error message:
Property ApproximateDate.year appears not to be saved by its DTO (put in ‘0’, and got out ‘null’)
This error happens on average once every 10,000 boot cycles as it depends on a random number from 0 to 9,999 coming out as zero.
Issue: 4298
Changes
Prevent linked bookings using linkedBookingParent as link to child
The property Booking.linkedBookingParent exists so that a child linked booking knows who its parent booking is.
You may also provide a property that allows a parent booking to reference the child.
This ought to be a custom property that you add for the purpose, as we do not provide a property for it since it necessarily implies that the parent has only a single child, which may not be true.
However, the UI allowed the property linkedBookingParent to be used for the link from parent to child as well as the link from child to parent.
This is confusing and so is now prevented.
Issue: 3645,3847
Sort list reports using the sort order defined in the bakery
Display 3 letters for the month in the navigator above the calendar instead of full month name
As you clicked the arrows to move forwards or backwards a week or month, then changing from one month to another would mean the buttons would change their location because of the variable month name length.
Changing this to a constant three letters beings better stability to button locations.
Issue: 3864
Add support for a number of templates and rules in the licence to override standard starter licence limits
Currently the starter licence limits the number of templates to four and the number of rules to four, while a premium licence allows an unlimited number.
We can now alter a licence so that additional templates and rules can be added to a starter licence.
Issue: 3958
Append trailing slash to system settings Email Base URL if one not provided when configure new system
The Emailed Base URL system setting can be used by workflows to generate a URL that, when accessed, will result in a call back to Calpendo.
However, if this doesn’t have a trailing slash, and workflows don’t check for and append a slash, then URLs generated by a workflow will not work.
When you configure the initial screen for a Calpendo, it asks you for the base URL, and this now has a slash appended automatically if there isn’t already one there.
Issue: 4059
Add id to buttons and text boxes in login and new user request pages
Make the error message from linked bookings more user friendly
When a linked booking parent cannot be created or updated because an insufficient number of child linked bookings could be created, then the error message presented to the user was a bit confusing.
This language has now been made clearer.
Issue: 4175
Add licence type (full/lite/starter etc) to licence server requests
Add scripts for exporting attachments to the INSTALL directory
The Calpendo release now includes a new directory in the archive in INSTALL/export_exprodo_events for exporting attachments programmatically from a script.
Issue: 4208
Make all biskit type columns use ascii char set and related collation
Some tables store a column that references a biskit type. There can be one of two reasons for this:
In all cases, we have always enforced the requirement that the text used for a biskit type matches a simple expression that means it consists solely of upper and lower case letters, digits and the underscore.
In particular, it cannot have accented characters or any exotic non-ASCII characters.
Each string-valued column stored in the database has associated with it a character set used by that column, and also a collation that specifies how to order and compare values.
The data stored within these columns is always compatible with the database character set known as ‘ascii’, which reflects the ASCII characters.
However, the actual character set defined was left to be the default for the database. Since MySQL has changed the default in recent versions, it means that you can have a different character set being used for some of these columns than others.
The 11.0 upgrade introduces changes to the way repeats are handled.
In particular, it creates a new “repeats” table which stores a column for a biskit type, and as a part of the upgrade, values stored in this column are compared to the ‘cls’ column in the bookings and templates column.
However, since the repeats table is new, it was being assigned the new default character set, and the bookings and templates tables being old meant they could use the old default character set. This caused a failure during the upgrade when run on a MySQL database.
So now we modify all columns that store a biskit type so that they are explicitly declared with the ‘ascii’ character set, along with the default collation for that character set, which is ‘ascii_general_ci’.
Issue: 4209
Security Fixes
On every system, clicking the “Register New User” button results in a list of all registered users (their numerical id number, login name and real name) being sent to the browser.
On all Calpendo systems, it also sends the id number, project code and name of all projects.
This user and project information is not usually required, and should not be available before a user has logged in. This represents a data breach since it is possible to enumerate all users and projects on an enterprise system, and all projects on any Calpendo.
If users reference any other biskits, then all instances of whatever type is referenced is also sent to the browser. This is here so that a user that self-registers can select their user type or department etc.
However, if there were any sets of biskits attached to a user, for example their training records, then training record id numbers would also be sent, plus any name if they had one.
Clicking the “Register New User” button results in the browser being sent some information about all users in the system.
This includes their numerical ID number (which encodes the date/time the user was created), their login name and their real name.
The ID number, project code and name of all projects was also sent to the browser.
An attacker could use this to see the names of all users on Calpendo and the date on which they became a user.
When a user self-registers, there can be drop-downs, like the one that allows them to select their own user type. For this to work, the name and ID number for every user type must be sent to the browser.
This was looking for any type of biskit referenced by a user, and sending the name and ID number of every biskit of that type.
The fix specifically prevents user and project information from being included.
Further, we exclude any biskit type for which the user “nobody” does not have EXISTS permission on every instance of that biskit type. For example, if a user were given a property that referenced a resource, then the name and ID of all resources would be sent to the browser. But if just one resource has a permission that prevents user “nobody” from being able to know it exists, then no resources would be sent to the server.
Issue: 4294
Bug Fixes
BUGFIX: Template prevents bookings 45 minutes before template start
Create a template rejecting everyone. Set it to start at 9:00.
On the calendar, if you click on any quarter-hour from 08:15, the templat rejects you outright whereas one might expect it would allow you to make a booking 08:15-09:00.
Issue: 3710
BUGFIX: Booking fields that are filtered don’t filter on first click after browser refresh
BUGFIX: Booking references from other biskits do not display name format specified in bakery
If you have a biskit with a booking field on it (ie that links to a booking and also has the little calendar icon next to it to take you straight to the calendar) then the text used for the link is:
Booking ID/start date/start time/finish time
This should be whatever is specified in the bakery as the name property or the format definition for the biskit.
Issue: 3781
BUGFIX: %dateRange% format always repeats the date even for bookings that start and end on the same day
The dateRange property on a booking is correctly displayed as:
[dateRange.start.date] [dateRange.start.time]-[dateRange.finish.time]
Except when the booking stretches over more than one day, in which case it is correctly displayed as:
[dateRange.start.date] [dateRange.start.time]- [dateRange.finish.date] [dateRange.finish.time]
However if you use %dateRange% in the format or when specifying what to show in bookings in the Calendar view, it always uses the version that repeats the date, even for bookings that start and end on the same day.
Issue: 3782
BUGFIX: Columns displayed in a list report reset to defaults after item in list is edited
BUGFIX: Workflow Search Action using a ‘Not All’ condition returns incorrect results
When a Workflow Search Action includes a ‘Not All’ condition on the search, then the results it finds are incorrect.
Issue: 3823
BUGFIX: Display is blank when viewing linked booking null parent-to-child prop
BUGFIX: Reports with null conditions cause multiple failures
Reports can have no conditions, but what that should mean is that the report has conditions that say that are empty rather than the conditions being null.
No report should ever have null for its conditions, although it has been observed.
When this happens, it resulted in an error running the report.
Issue: 3858
BUGFIX: Searching for Calpendo Config generates an IllegalArgumentException
If you try to search for Calpendo Config, then you get an error:
Failed to fetch data: could not extract ResultSet
Issue: 3909
BUGFIX: Holiday dates import not accessible to calculateWorkingHours workflow function
If you use the CSV file import utility to import holiday dates, then the workflow function calculateWorkingHours ignores the imported holiday dates.
Issue: 3923
BUGFIX: Custom Tree Page with grouping by null-valued biskit gives exception
When using a resource biskit for dynamic sub nodes on a custom tree page, if one of the resources has no location and location is used as a property to group biskits the page can’t load through menu with an error.
Issue: 3932
BUGFIX: Resource sort order ignored in Calendar-by-location
BUGFIX: Workflow sort action fails if the list of biskits contains a null value
BUGFIX: When multiple template messages should be displayed, some may not be
If you have a message on a template group, and also have a message on the template directly in the template calendar, then at times when both messages should show, only one does show.
Issue: 4031
BUGFIX: Default time when creating booking is weird when using predefined time slots
BUGFIX: Breaking booking rule on linked booking of one instance of a repeat prevents further expansion of the repeat
BUGFIX: View history of a linked booking and click on one of past versions gives an exception
BUGFIX: Click on biskit can show error saying possible permissions problem
Some permissions could result in an error being displayed incorrectly when you click on a biskit.
Issue: 4099
BUGFIX: Reports with missing columns or bad conditions generate exceptions when run
BUGFIX: Information Pages module does not set up pages in a hierarchy
Calpendo has a module called “Information Pages” which when loaded allows you to display pages about your facility.
This allows you to specify that a page has a parent and children, so that the pages display in a hierarchy using a tree structure.
However, it would always display as a flag list instead of in a tree.
Issue: 4118
BUGFIX: Cannot disable rule when over limit by more than 1 in Calpendo Starter
A starter licence allows only a limited number of bookings rules to be used.
If you are over the limit (perhaps because your licence changed from a premium system to a starter), and try to edit a rule to make it disabled, then you are not able to.
It gives a message “Failed to save Interval Rule” without any more information.
Issue: 4137
BUGFIX: Edit the schedule for a report and the start time-of-day is ignored
BUGFIX: Booking repeat displays badly if the booking layout assigns full detail tab to it
BUGFIX: Booking history fails when EXISTS permission depends on type
BUGFIX: Cannot delete bookmarks (error message says it doesn’t exist)
If you try to delete any bookmark that should be deletable, then it fails with a message to say the bookmark doesn’t exist.
Issue: 4190
BUGFIX: Workflow action displays in red box on history page
When a workflow modifies some data, the history page shows which workflow action made the change.
This is displayed on the history page in a red box, which is normally used to indicate an error.
The red box no longer displays in this context.
Issue: 4193
BUGFIX: Click on group report row shows nothing if time condition to-the-hour, minute or second
Suppose you create a group report of bookings, and add a condition of the form “dateRange.start equals DATE-TIME to the HOUR”.
Then, if the report finds any bookings, click on any of the rows displayed in the group report and it doesn’t find the bookings in that group, and so does not display them.
The same happens if you use a condition that is to-the-minute or to-the-second.
Issue: 4194
BUGFIX: Upgrade directly from 9.0.67 to 11.0 fails
BUGFIX: Tooltip on LinkedBookingLink.cancellationReason does not say when reason will be used
The tooltip on the cancellation reason on a Linked Booking Link did not make it clear when exactly the provided reason would be used, and it wasn’t otherwise obvious.
The tooltip has now been clarified.
Issue: 4201
BUGFIX: Validation errors in linked booking links are not displayed
If a linked booking link is configured to reference a property that has been deleted, then this gives an error.
However, the UI does not tell you what the error really is.
Issue: 4202
BUGFIX: Read-only calendar does not handle non-Latin characters properly
A read-only calendar displays a non-interactive view of bookings.
If any of the resource names or bookings contain accented characters, then the calendar does not display properly.
Issue: 4205
BUGFIX: Read-only calendar in systems created in 10.1 cannot cope with formatted resource IDs
Any Calpendo that was first created in 10.0 or later has a default workflow that can display an anonymously-accessed read-only non-interactive calendar of bookings. This is disabled by default.
The workflow will parse arguments in a URL so that you can, amongst other things, define the resources whose bookings should be displayed.
If you specify the resource IDs using a formatted ID (as is displayed in the Calpendo user interface) then the calendar did not display.
Issue: 4206
BUGFIX: Read-only calendar sometimes fails when specify large numeric value for resource ID
The read-only bookings calendar does not display when one of the resources being displayed has an ID greater than 2,147,483,647 and the user that is the source of displayed styles has no user setting for the resource.
Issue: 4207
BUGFIX: JSON error reported when viewing history of booking modified in 11.0.7
BUGFIX: LazyInitializationException updating booking after having modified workflow with BookingRuleWorkflowEvent
If you modify a workflow that contains a BookingRuleWorkflowEvent, then any time you create or update a booking thereafter you get an exception and are prevented from making the change.
The only work-around is to restart Tomcat after updating any workflow with a BookingRuleWorkflowEvent.
Issue: 4257
BUGFIX: “could not initialize proxy” error when adding a note to a project
BUGFIX: Configure notes in layout and then view layout shows misconfigured
BUGFIX: Booking reminders partially broken - wrong content and tries to send emails to email address “null”
BUGFIX: SQL Export of reports & timed workflow events broke start & finish
BUGFIX: TimedEvents don’t work if the start date/time is null and users don’t see the start date/time
BUGFIX: Permissions for repeat templates & bookings are overly restrictive
The change to the way repeats work in 11.0 completely changed the way bookings and templates handle repeats. One of the consequences of this is that a repeat is now a separate biskit that can be queried and modified where before it could be.
That’s because repeats used to exist only as an integral part of the booking or template that owned it, and was stored in the same database table row as the booking or template.
This meant that there was only ever one row for a repeat booking, and so all instances in a sequence had to be identical.
This is now different, and it means the repeat information now lives in a table of its own.
When you edit a repeat booking in such a way that it required a change to the repeat as well as the booking, then it was checking that you had permission to change the repeat as well as that you had permission to change the booking.
However, this doesn’t and can’t work because the repeat does not have enough context to evaluate whether you should be allowed to modify it.
For example, there is no permission one could express directly for the repeat to indicate that the resource’s manager user group should be permitted to modify the repeat because the repeat does not store a reference to the booking.
So now when you modify a repeat booking, it will only check permissions for changing the booking. If you want to limit what can be done to repeats, then create a permission on the booking or template to do so.
Issue: 4280
BUGFIX: User names with a period in them are rejected
BUGFIX: Boot fails every 10,000 boots with complaint about ApproxateDate.year not being saved by its DTO
At boot time, we run automated tests to make sure that any classes that use a data transfer object (DTO) to transport their data over the network are well defined.
Occasionally, when there’s a check on the biskit ApproximateDate’s year, this will fail complaining that it put in zero and got out null with this error message:
Property ApproximateDate.year appears not to be saved by its DTO (put in ‘0’, and got out ‘null’)
This error happens on average once every 10,000 boot cycles as it depends on a random number from 0 to 9,999 coming out as zero.
Issue: 4298
BUGFIX: New user registration fails in an Enterprise system
When you try to register, it appears to work except that an error flashes up briefly after you enter your details and click the register button.
The message says something like:
Could not create fragment 956 for a child of ExprodoUser - that is probably not fragmented. We calculated the fragment type as ExprodoUserFragment956
This bug was introduced in 11.5.40 as part of the fix for issue 4164.
Issue: 4314
BUGFIX: Cannot log in if login name contains the @ symbol
11.0.9 (and so also 11.5.44) introduced a limit to the characters that can be used in a login name.
However, there are pre-existing users that break the rule, and so can’t log in. Also, they don’t necessarily get a choice of login name when using a single-sign-on system.
In particular, the @ symbol being prohibited is a problem if login names look like email addresses.
This was the set of characters not allowed:
TAB SPACE !"£$%^&*()=+{}[]~#'@;:/?<>,|\
This has been changed to be more liberal in 11.0.10 so that the illegal characters are:
TAB SPACE !"&*(){}[]';?<>
Issue: 4322
Bug Fixes
The two database upgrade scripts in 11.0.7/3 are only meant for Calpendo, but neither script specified that it was Calpendo-only and so they ran in other Exprodo apps too.
This meant that upgrading non-Calpendo apps would result in a database upgrade error, albeit a benign one that needed no remediation.
Issue: 4324
Bug Fixes
BUGFIX: Edit a child linked booking and you get a shallow exception
BUGFIX: Error messages containing HTML “br” tags in linked booking error popup
Bug Fixes
You can add menu item called “Calendar by location”.
This adds an item to the menu that expands out to provide an entry for every location that contains at least one resource. Click on the location, and it takes you to a calendar for all the resources in that location.
However, this had stopped working so that it was instead showing all resources.
This bug was introduced in 11.0.9.3, 11.5.44 and 12.0.4 as a result of the fix for issue 3985.
Issue: 4325
Bug Fixes