Title: Release Notes For Version 11.5.54
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
Changes
When uploading a file and storing it in the database, there is now a variety of logging done to help track down what’s happening if things go wrong.
This is enabled by going to #verboseSearch and turning on the verbose setting for AttachmentDAO, TemporaryFileManager and ExprodoUploadServlet.
Issue: 4367
Sometimes it is necessary for a customer to do something that generates log output in the browser itself.
We now have added support for this, and will instruct customers individually if and when this is required.
Issue: 4374
Security Fixes
When you have an attachment on a biskit, and view the biskit in a read-only context, then the link to show the attachment has a URL that includes putting your session ID into the URL.
This is bad for security because it means the session ID is visible to anybody looking at server logs, which is not ideal.
When you upload a file, that can send multiple network messages to the server, some of which also include putting your session ID in the URL. This happens more if the file you are uploading is large, or if your network connection is slow (so that the browser asks for status updates while the file is uploading).
The session ID has now been removed from these things.
Issue: 4379
Temporary files are generated in several circumstances. For example:
Downloading those files would then require a key that had generated for it.
However, the download itself did not require that the user be logged in.
This would mean there’s a time window when a temporary file could be downloaded by somebody else. This would require that an attacker get a copy of the file’s key (which is very hard to guess as it contains a 16 character random text string), and they use it between the temporary file being created and deleted.
Temporary files are normally deleted either when the user that generated them logged out, or periodically Calpendo would look for temporary files older than one hour and delete them. This used to happen every 24 hours but now happens every 4 hours.
So the opportunity to exploit the weakness would be very limited.
We now require that the user is logged in, so they must have a cookie containing a valid session ID, and the temporary file must have been created for the user logged in when the download occurs.
Issue: 4380
Whenever a temporary file is generated, it is because of the action of some user. That user is recorded against the temporary file so we know who caused it to be created.
When downloading a temporary file, we not limit the download to the same user that created it. Temporary files are generated as part of a wider action by the user, and there’s no need for anybody to download a temporary file generated by somebody else.
The security benefit from this is probably quite limited because it would be quite difficult for an attacker to download a temporary file generated by somebody else.
Issue: 4382
Bug Fixes
BUGFIX: Parent linked booking allowed to change to time when child is refused
BUGFIX: Calendar by location not filtering resources
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
BUGFIX: Cannot save a workflow function with MappedString argument
If you try add a custom workflow function that has a Mapped String as an argument, then it gives an exception when you save it.
Issue: 4350
BUGFIX: Cannot boot when custom function has mapped int arg with no mapped int
If you have a custom function in a workflow, which has an argument taking a MappedInt, but that does not specify which Mapped Int it should be, then the system will not boot.
Note that it’s not easy to generate this situation because the UI will force you to choose a Mapped Int.
However, if you use the SQL export facility, and then import that SQL to another system, it is quite possible to have no MappedInt set on a custom function argument thereby generating this error.
Issue: 4351
BUGFIX: Cannot boot when a function action references unknown biskit type
If a custom function in a workflow specifies an argument that takes a biskit, but it does not specify which type of biskit it is, then the system cannot boot.
Note that it’s not easy to generate this situation because the UI will force you to choose a BiskitDef.
However, if you use the SQL export facility, and then import that SQL to another system, it is quite possible to have no BiskitDef set on a custom function argument thereby generating this error.
Issue: 4353
BUGFIX: Validating workflows does not show errors like unknown BiskitDef
If a workflow function references a BiskitDef that does not exist, then clicking “Validate Workflows” did not show the correct error message for it. (But then, it wouldn’t boot before now either).
Also, clicking on a workflow that included such an error would show an exception pop-up instead of the normal validation error pop-up.
Issue: 4354
BUGFIX: DB schema update fails with message “wrong column type column [start] in table [report_schedules]”
BUGFIX: Uploading files logs errors for things that are not errors
BUGFIX: Update project to assign new user as owner gives ClassCastException
This only happened in limited circumstances, when some debug options were enabled and you edit a project and change the owner to some user not currently associated with the project (and not yourself).
Issue: 4369
BUGFIX: Copy biskits with attachments and new attachment says it has size zero
For example, add an attachment to a booking. Copy the booking on the calendar, and create a new booking. The attachment will be copied to the new booking, which will work.
However, when you look at what the attachment thinks its size is, it says zero.
You can see this in the UI by searching for bookings in the Bookings->Search page, run a group report, and show the attachment.size property.
However, the attachment does have a real size, and downloads properly, so it is lying about being zero length.
Issue: 4370
BUGFIX: Uploaded files from anonymous user if login name contains @
If a login name contains the @ symbol, files uploaded by them would end up not being associated with that user, but as though uploaded anonymously.
Such anonymous uploads used to be accepted, but no longer are.
Issue: 4371
BUGFIX: Updating DB schema complains about workflows.finish column type
BUGFIX: File uploads sometimes end up with zero length files
When a file is uploaded as an attachment to something, then it was sometimes ending up as a zero length attachment.
Issue: 4375
BUGFIX: Repeat.ownerId shows value in reports not formatted as a primary key
Reports showing a value of Repeat.ownerId would show a plain (and large) number instead of formatting it like ID numbers are formatted elsewhere in Calpendo.
Issue: 4377
BUGFIX: History on a Holiday Date Rule gives a ClassCastException
If you have a Holiday Date Rule that contains dates, and try to view the history of changes to the rule, then clicking on any of the versions where it had some holiday dates would given an exception.
Issue: 4378
BUGFIX: When child linked booking change denied, user sees same message twice
BUGFIX: Bad msg format if booking update gives multiple linked booking errors
BUGFIX: Enterprise cannot boot when running on MySQL rather than MariaDB
Changes
When a new user registers themselves to request an account, they are offered a form including most of the properties on a user.
If there is a property that stores a file attachment, then this will let them upload a file.
By default, we now prevent file uploads before a user has logged in. This is what we refer to as an anonymous file upload because at the time the user is registering themselves as a user, we don’t know who they are.
You may or may not require that users be able to upload a file at the time they register themselves as a user, and there is now a system setting to allow the choice to be made.
This is on the “Security” tab, and is referred to as allowing anonymous file uploads.
This is disabled by default so that users registering themselves are not allowed to upload a file.
Issue: 4406
Bug Fixes
BUGFIX: Enterprise export of project with a populated one-to-many property fails
BUGFIX: Default database workflow events on new system do not have an update phase set on database events
When a new virgin database is created, it comes with some default workflows that send emails when a user registers and other things relating to the user lifecycle.
None of the DatabaseWorkflowEvents created have a “Database Update Phase” set on them, and this is a required part of dtabase events.
This means they don’t run at all.
New systems created from now on will have this set correctly, and any pre-existing systems which have a DatabaseWorkflowEvents without a “Database Update Phase” set on them will automatically have it set to “After transaction”.
Issue: 4373
BUGFIX: Report columns “lastRepeat.start” and “lastRepeat.finish” are not deleted in upgrading to 11.0 and so give errors
The lastRepeat property was removed in 11.0 from Booking and Template, and there was a database upgrade in 11.0.5 to remove columns in reports that referenced lastRepeat.
However, it was written in such a way that it missed any column lastRepeat.foo for some pseudo-property of lastRepeat.
For example, a report that references lastRepeat.start or lastRepeat.finish or lastRepeat.start.year etc would not be deleted.
This means that after upgrade, it would still have a column referencing lastRepeat, and cause an error when such a report was run.
These columns are now automatically removed.
Issue: 4401
BUGFIX: User registration page doesn’t load if there is an attachment property
If there is an attachment property added to the definition of a user, then whenever anybody tries to register themselves as a new user, the user registration page fails to open, instead it gets immediately redirected to the login page.
Issue: 4405
BUGFIX: Project Biskit subtypes are not applied when creating new biskits in v11
If you define subtypes of project, then whenever you create a new project, you are asked which type of projject it should be.
However, the project that is displayed and saved is always the top-level type of project.
This means, for example, that any custom properties added to the subtype of project the user selected would not be displayed or saved.
Issue: 4407
BUGFIX: Uploading a file that is larger than the max file upload size results in browser appearing to hang
BUGFIX: Total time booked rule gives exception when limits are applied across all time and time masks are in use
BUGFIX: Total Time Booked Rule shows bogus error message when acceptable booking time used
When you create a total time booked rule, you can set a custom message.
It comes with placeholders that will be replaced with the total number of hours and minutes that were actually used, so you can have a message read something like:
“You used 5 hours and 30 minutes for this project, but there is a limit of 4 hours”
When the total time booked rule finds zero time is used, then the error message for the rule would be displayed. But where there are placeholders for the amount of time used, they are NOT replaced by the actual time used (zero), but left as placeholders.
This makes for a weird message displayed to the user, which is displayed as a disappearing blue info box in the bottom right corner.
The same is true when it finds there is some time used, but within the acceptable use. This is different code, but with the same problem.
In both cases, the rule should and does accept the booking, but still generates an error message, and one which is not formatted correctly.
It no longer shows an error message in these circumstances.
Issue: 4412
Changes
When a new user registers themselves to request an account, they are offered a form including most of the properties on a user.
If there is a property that stores a file attachment, then this will let them upload a file.
By default, we now prevent file uploads before a user has logged in. This is what we refer to as an anonymous file upload because at the time the user is registering themselves as a user, we don’t know who they are.
You may or may not require that users be able to upload a file at the time they register themselves as a user, and there is now a system setting to allow the choice to be made.
This is on the “Security” tab, and is referred to as allowing anonymous file uploads.
This is disabled by default so that users registering themselves are not allowed to upload a file.
Issue: 4406
Bug Fixes
When a new virgin database is created, it comes with some default workflows that send emails when a user registers and other things relating to the user lifecycle.
None of the DatabaseWorkflowEvents created have a “Database Update Phase” set on them, and this is a required part of dtabase events.
This means they don’t run at all.
New systems created from now on will have this set correctly, and any pre-existing systems which have a DatabaseWorkflowEvents without a “Database Update Phase” set on them will automatically have it set to “After transaction”.
Issue: 4373
The lastRepeat property was removed in 11.0 from Booking and Template, and there was a database upgrade in 11.0.5 to remove columns in reports that referenced lastRepeat.
However, it was written in such a way that it missed any column lastRepeat.foo for some pseudo-property of lastRepeat.
For example, a report that references lastRepeat.start or lastRepeat.finish or lastRepeat.start.year etc would not be deleted.
This means that after upgrade, it would still have a column referencing lastRepeat, and cause an error when such a report was run.
These columns are now automatically removed.
Issue: 4401
If there is an attachment property added to the definition of a user, then whenever anybody tries to register themselves as a new user, the user registration page fails to open, instead it gets immediately redirected to the login page.
Issue: 4405
If you define subtypes of project, then whenever you create a new project, you are asked which type of projject it should be.
However, the project that is displayed and saved is always the top-level type of project.
This means, for example, that any custom properties added to the subtype of project the user selected would not be displayed or saved.
Issue: 4407
When you create a total time booked rule, you can set a custom message.
It comes with placeholders that will be replaced with the total number of hours and minutes that were actually used, so you can have a message read something like:
“You used 5 hours and 30 minutes for this project, but there is a limit of 4 hours”
When the total time booked rule finds zero time is used, then the error message for the rule would be displayed. But where there are placeholders for the amount of time used, they are NOT replaced by the actual time used (zero), but left as placeholders.
This makes for a weird message displayed to the user, which is displayed as a disappearing blue info box in the bottom right corner.
The same is true when it finds there is some time used, but within the acceptable use. This is different code, but with the same problem.
In both cases, the rule should and does accept the booking, but still generates an error message, and one which is not formatted correctly.
It no longer shows an error message in these circumstances.
Issue: 4412
Some imports from one Enterprise shard to another fail when a biskit that is required is present nested within the data received, but not listed as a top-level biskit that should be created by the import.
This has been observed for attachments within an attachment set.
These are now automatically managed to avoid the problem.
Issue: 4438
Bug Fixes
This is a bug introduced in 11.5.52 as a part of the fix to issue 4438 “Enterprise imports fail if some referenced provided biskits not directly exported”
When exporting a workflow to another shard, you could receive an error telling you there was an error like this:
A different object with the same identifier value was already associated with the session : [BiskitCreateOrUpdateWorkflowActionItem#872880787175425]
This was a problem with trying to do a double import of the workflow by mistake.
Issue: 4492
If you do a CSV import to update a project, but you specify that it’s a “Base Project” that you want to update instead, then you end up getting a ShallowException.
Issue: 4494
Changes
Warn user when search for bookings on general search page will not handle repeats properly
There are some circumstances where the general search page, found on the menu as Search->Search and then selecting Bookings, could produce incorrect results without the user being aware.
If you use a include-times-between condition, which will be provided by default, then it will work.
But if you remove that, then it won’t find all repeat instances.
If the conditions you add do not provide a fixed range of dates that the returned bookings must be within, then it will now warn you, and suggest that you use the booking search page instead of the general search page, or to add a condition on the booking’s dateRange property with an includes-time-between relation.
Issue: 3910
Add min and max DB connections to system event for source “ExprodoServiceImpl” and category “Boot”
Record the number of DB connections in use in system status
The number of database connections is now recorded in the SystemStatus biskit.
One of these is recorded every 15 minutes to capture information like the amount of memory in use, and now the number of database connections in use.
Issue: 4444
Make error messages clearer when making booking for bad project
The error message “You can only choose one of your own projects” sometimes happens when a booking is made for a project that is not related to the user trying to make the booking.
The regular user interface should prevent such a thing.
However, a workflow may create an erroneously configured booking that can lead to this message.
When this happens, it can be confusing what’s happening.
In particular, there are two errors that can be conflated. “You can only choose one of your own projects”
and “You must choose a project configured to use [ResourceName]”
To help make clear what the problem is, and to make the above two harder to conflate, they now contain more information about the problem.
Issue: 4448
Allow rule editor to display if user has permission to READ rule
The rule editor did not allow itself to display if the user did not have permission to create or update rules.
This is now extended so that the rule editor is also accessible if the user has permission to read rules.
Issue: 4477
Make all biskit_defs and property_defs columns use ascii char set and related collation where appropriate
This is an addendum to a change made in 11.0.9 where many columns had their character set converted to ASCII and related collation. This was for columns that stored a biskit type.
However, this did not include the tables biskit_defs and property_defs that each have multiple columns that should receive the same treatment.
Nobody should notice the change, but it’s an added protection to ensure the affected columns cannot contain accented characters where none should exist.
Issue: 4490
Add “System Status” node to bakery tools
There’s a problem seen sometimes in 11.0 whereby updating the DB schema or reloading DB config in the bakery does not work.
This was addressed, to some extent, in issue 4442: “System locks up if try to update DB schema with insufficient DB conns”
The solution was to prevent the lock up by showing an error message when there were insufficient free database connections to use.
While this was better, it did not address the underlying problem of running out.
While we could increase the number of connections, it would be preferable to identify why and when we use too many.
So this change adds a tool in the bakery to tell you how many connections are in use, as well as the maximum number of connections and the amount of memory in use by the server. This should help identify the underlying problem.
Issue: 4508
Bug Fixes
If you create a workflow, add a “Define Interface” action with at least one input or output, and then add a “Define Subroutine” configured to use the previously created interface, then you cannot save the workflow.
This gives an error: “Multiple representations of the same entity…are being merged”
Issue: 3759
From any search page where you have a list of bookings, use checked-editing to edit the description of one of a repeating sequence, and all instances are changed without you being asked whether you’d like the change to apply this-item, this-and-later or all-items.
Issue: 3912
Generally, bookings should not be deleted, but should be cancelled instead if they are not wanted.
The bookings calendar does not provide a mechanism to delete, only to cancel.
But if you go to a search page to search for bookings, then it does allow you to delete bookings.
If you delete an instance of a repeat booking from a search page, then this can cause problems. It would not ask you, like the bookings calendar does, whether you want to apply the change all-items, this-and-later or this-item.
To explain why it is a problem, there are three cases to consider:
We now do ask which repeat instances it should be applied to, and we handle it as a cancellation and not a delete.
Issue: 3922
Repeat bookings may repeat forever, and therefore have an infinite number of repeating instances.
We expand the repeats only so far into the future (90 days by default), and thereafter anything shown on the calendar is generated on-the-fly from the last of the repeating instances that have been expanded in the database.
These generated instances that aren’t stored in the database are known as ephemeral.
There is an “ephemeral” property on Booking so that you can see which ones are stored in the database and which ones are generated.
If you create a report and choose conditions to show only ephemeral bookings, then the report would always return nothing.
This is because the database only contains non-ephemeral bookings (by definition) and we were applying all the conditions to the database search, and only then expanding repeats.
This is now handled better so that if you search for ephemeral bookings, it will find any that it should.
Issue: 3993
Suppose you create an annually repeating booking that repeats forever on a resource that requires cancellation reasons to be provided.
Then you edit the booking, and change it to repeating monthly by day and save it.
Then the save fails with an error message that says you must provide a cancellation reason - even though you were never given the opportunity to provide one.
The mechanism that detects whether we should ask for a cancellation reason did not always correctly identify when a repeating instance would need to be cancelled. In the case of changing from annually repeating to monthly repeating, the instance that needs cancelling might be a long way into the future, and that wasn’t spotted.
Issue: 4103
Calpendo includes an optional module called CTMS. This provides support for clinical trials, where it can track all the visits a subject has, and the tasks that must be performed on those visits, as well as all things that need to be booked for those visits and tasks.
When the CTMS module is loaded, it creates a property called “visits” on Project.
This means Project.visits is a special property that is reserved for CTMS.
If you try to add a property called “visits” to Project on a Calpendo without the CTMS module loaded, then it would silently allow you to do it, but it then would not work properly because of its special nature.
There is now an error generated if you add such a property that prevents you from adding the Project.visits property.
Issue: 4204
Suppose you have two BiskitDefs that represent subtypes of Booking, and they both have their own attachment property that happens to have the same name.
Then when you copy a booking from one, and paste it to a resource that uses the other booking BiskitDef, the new booking appears to have been created properly.
However, the attachment on the new booking cannot be downloaded. You get a permission denied error, and a system event is created with the message:
Permission denied trying to download attachment [PK], name
'[FILENAME]' due to referee type being inconsistent with the
PropertyDef's owning BiskitDef
Issue: 4434
If you take a dump of the database and exclude the database_upgrades table, and then you try to upgrade from 10.1.x to 11.0, it cannot cope with the missing table, and the upgrade fails.
Issue: 4439
If there is a property defined for the licence biskit, but there is no such property in the source code for the biskit itself, then when populating the licence from the licence key, we get an exception on boot.
This was observed as a result of issue 4439 “Upgrading from 10.1.x to 11.0 fails without database_upgrades table”.
Issue: 4440
When upgrading to 11.0, the upgrade can leave some repeat bookings that are entirely in the past.
After Calpendo boots, it would then be expected to convert expand those historical repeats to enumerate the repeat instances up to 90 days from now.
However, if the resource is configured to prevent changes to old bookings, then that means the expansion is prevented from happening, and you see lots of errors in the log and system events as a result.
Issue: 4441
The file hibernate.cfg.xml in the Calpendo distribution lets you specify (amongst other things) the minimum and maximum number of database connections.
This is in properties:
The default for these is 5 and 20 respectively.
When the server is busy with users making requests, the number of connections will go up, and will be limited by whatever the maximum is.
For a busy server, 20 connections may not be enough and you may run out.
When somebody updates the DB schema, it creates a whole new set of database connections. That means you get the minimum (5) connections added to the existing connections.
After the schema update script has been generated, those extra connections (5) are discarded.
When somebody reloads the DB config, it creates a whole new set of database connections (another 5). After the reload is complete, the new connections are retained, and the older connections are closed.
In both cases, it means that if there happen to be 16 or more connections in use at the time of trying to either update the db schema or reload the db config, then it will fail because it won’t be able to get the full set of 5 connections required.
We now check for the current number of database connections, and the number required, and avoid updating the database schema or reload the database configuration if there will not be enough, and tell the user what the problem is.
Issue: 4442
When using CAR or pGina to send actual usage information to Calpendo, things are handled slightly differently in 11.0.
It means that an internal system user runs any workflow that turns the low level actual usage information into ResourceUsage instances.
This was causing a problem whereby it would think the user was creating a record for a project they were not related to.
Issue: 4449
Suppose you create a workflow with a CustomFunction that takes an argument that is a MappedInt or a MappedString.
Or suppose you create a workflow with a CreateVariables that has a variable that stores an instance of a particular MappedInt or MappedString.
Then when you go to the bakery and select the MappedInt or MappedString referenced by the workflow, and click the References button, it will not find the reference in the workflow.
The same can happen from workflow actions CreateBiskitDef, DefineConstants and DefineInterface.
Issue: 4450
Suppose you have a summary report where you add a pseudo date property to the column (for example, weekOfYear), and you add something else (anything) for the row.
Then the columns are sorted by string ordering rather than numerical ordering. This means “10” comes before “9”, for example.
Issue: 4452
There are many tables in the database that store conditions.
Each of these tables has a column called owner_id that stores a reference back to the biskit that the condition belongs to.
Every row in these conditions tables should have a non-null value in the owner_id column.
However, when you create a new Calpendo database, there are two rules created by default, and their conditions have a null value in the owner_id column.
The rules are “Double Bookings” and “Predefined slots must be adhered to”.
The tables rule_conditions, rule_ignore_conditions, rule_not_apply_conditions and rule_tally_conditions all have rows with a null owner_id are affected by this.
Issue: 4455
When your mouse pointer hovers over a booking in the calendar, it will show a “tooltip” with some details about the booking. This can be customised, with each resource specifying what the tooltip should contain for its bookings.
A booking resource’s tooltip can reference the value of any property on the booking, but when you search for references to the property from the bakery, it does not find anything that referenced it from a resource’s booking tooltip definition.
Issue: 4456
When you cancel a booking for a resource that requires cancellation reasons, then you get shown a pop-up that lets you specify the reason.
The text used on that popup for the title, the message in the popup and the button labels all make sense.
However, sometimes, you might modify a booking in such a way that it requires something to be cancelled even though you didn’t directly ask for a cancellation.
For example, if you have a daily repeating booking and convert it to something that repeats every Monday, then the bookings that are not on Mondays will need to be cancelled.
From the user’s perspective, when the popup asking for a cancellation reason appears, it doesn’t really make sense to have a popup with a title of “Cancelling Booking”, and buttons “Cancel booking” and “Do not cancel booking” when they changes the type of repeat from daily to weekly.
So the pop-up asking for a cancellation reason now contains different text when the user did not directly ask for a cancellation, and the buttons contain different text as well.
Issue: 4457
When a user registers themselves as a new user, then there is usually a workflow that should send them an email to let them know we have received their request.
However, that email would not be sent.
Also, there would also be an entry in the audit log to indicate that the user was created. The audit log entry should say that the user created their own user, but it would instead say that it was created by the system user.
They should now receive the email, and the audit log says they created the user themselves.
Issue: 4458
When you copy and then paste menu items into a menu using the menu editor, then this can cause the page to scroll in such a way that the buttons at the top of the page become inaccessible.
Issue: 4459
Following a log out and log in, the “Export” button on a workflow does not display, with a browser refresh being needed to bring it back.
Issue: 4460
When you edit a menu in the menu editor, then sometimes the scrollbar shown in the pane that lists all the menu items is completely the wrong height for the content that is there. It looks like the system thinks there’s much more content there than there is.
Issue: 4464
If a workflow contains a Sort action, then an attempt to export the workflow to SQL (to facilitate copying to another system) generates an exception.
Issue: 4466
There’s a “Default Project Name” you can set in System Settings. This is used as the default name when you create a new project.
If you edit system settings and set the project’s default name to the empty string and save it, then the UI appears to have done so. However, refresh the page and you see it is set to the default value of “Enter project name”.
This now works properly.
If you also set a placeholder for the name property of a project in the bakery, then when you create a new project, the placeholder text will be shown while the project name is empty, and disappear as soon as you start typing.
Issue: 4467
If you cancel a repeat booking this-and-later, then this would require a change to the repeat biskit itself because the repeat stores the date when the repeating stops, and not the booking.
This requires a permission to edit the repeat itself, and we don’t generally have such permissions since nobody should change repeat biskits directly.
So now it checks the change to the booking is good, but when cancelling like this, it does not check permission to modify the repeat.
Issue: 4475
When you try to change the date of a booking that repeats weekly, you would get a message that said: “You cannot change the date of a booking that repeats weekly”
But this implies that you can change the date of a booking that repeats a different way, which is untrue.
So the message now reads “You cannot change the date of a booking that repeats” without specifying the type of repeat.
Issue: 4476
Suppose you edit the definition of Calpendo.Project in the bakery, and select the “owner” property. Then you should see that the inverse property name is “projectsOwned”.
If you then click on the “status” property, and then back to the “owner” property, you then see that the inverse property name is now unset.
If you were to save it, then the inverse property name would be removed.
Issue: 4478
When time slots are configured on the calendar, dragging your mouse from start to finish time could yield a booking of the wrong time range when the start or finish exactly matches the boundary of a time slot that should be excluded.
Issue: 4479
If a Workflow includes both a Define Constants Action and a Get Constants Action then it is not possible to perform a “Create Copy” and a “Save” of that Workflow because an error.
The error message is something like: Shallow property: DefineConstantsWorkflowAction#20250702.130213.13.1.children
Issue: 4480
If you click on a booking that is a child of a linked booking parent in the calendar and edit the times, and it’s a link configured to not allow children to change their times, then you get an error saying there’s a Shallow Exception.
Issue: 4484
When you change page to the Resource Editor, it can sometimes send a request to the server asking it for details of a biskit with type null and id zero.
This doesn’t cause any harm, but it should not have made the request.
Issue: 4486
Attempting to view the menu items under Help > Requirements in the menu editor gives an exception.
Issue: 4499
This relates to issue 3912, fixed in v11.0.17, but that issue applies specifically to using checked-editing of bookings.
This issue is about what happens when you use the booking search page to locate an instance of a repeat booking, click on the booking to show a booking pop-up, and then edit it.
It would not ask you whether you wanted the change to apply this-item, this-and-later or all-items, and instead would assume all-items.
It will now ask which of the repeating instances should be affected.
Issue: 4503
The bakery has a tool built in that allows for unwanted or incorrectly defined foreign key constraints to be removed.
This is only available for root users.
However, using it to delete a foreign key constraint was returning an error instead of working properly.
Issue: 4510
If you go to a booking search, and tick the check box next to any repeat booking and click the “Delete” button, then this would generate an erro:
Cannot read properties of null (reading ‘a’) is prompted
Issue: 4511
In the menu editor, you can add a custom page that will run a predefined report.
There’s an option in there to hide the report page’s search bar.
This will hide the File button, the Search for drop-down, the report type drop down, the conditions button etc.
This works perfectly for any report created from the Search->Search page, but it doesn’t work for any report created from any other search page.
So if you create a report from the Booking Search page, and then create a menu item that shows that report and asks to hide the search bar, it does not work. The search bar will not hide.
This same issue has another symptom. In the menu editor, you assign a “token” for the menu item for all menu items of type “custom page”.
This is what appears after the “#” in the address bar when you select that menu item.
When you run a menu item that runs a predefined report for a Search->Search report, then the address bar shows the token you selected after the “#”.
However, for a report created from another page (such as the booking search page), the URL initially shows the token you entered, and then immediately changes to the URL for the report. Eg it might show something like “#bookingSearch&id=20250821.154255.0.1&autorun=true”
Issue: 4512
After making changes in the bakery, one must click the “Update DB Schema” button to general the SQL required to modify the database to account for the changes.
You then click the Apply button to have that SQL executed.
When the server then executes that SQL, it will first regenerate the SQL and compare the SQL to what it found the first time. If it has changed, then it won’t run it.
It’s a a fairly straight-forward test to make sure nothing important has changed since the SQL was shown to the user.
There’s a fundamental assumption made here, which is that the SQL that is generated will always be identical when nothing has changed.
However, this assumption is faulty. When you make multiple changes, then the SQL contains multiple lines of code, and it is possible that the server will generate those lines in a different order each time.
This means it would sometimes think the SQL has changed, when it hasn’t really, it’s just generated them in a different order.
The test for whether the SQL has changed now checks that the same lines exist without a requirement that they be in the same order.
Issue: 4519
When you search for bookings, then by default we generate conditions including something that says “dateRange includes time between A and B” where A and B are dates that you would select.
If you don’t use an includes-time-between relation, then it’s actually quite difficult to get the conditions right so that they tell you about all repeat instances because the actual conditions required are complex. For more complex than one would generally think.
An example of this would be if you search for bookings with conditions that look like this, where A and B are dates:
dateRange.start no earlier than A dateRange.start no later than B
This looks like it should return bookings between A and B, and it will do that to some extent. But it won’t always return all the repeat bookings you would expect.
In some cases, if A and B are far enough into the future (more than about 90 days by default), then the report would find no repeat bookings at all, even when there are some that it looks like it should find.
Calpendo will now do a better job of identifying this situation and returning instances of repeats between those dates.
However, it’s always recommended to avoid this by using an includes-time-between relation because it is designed to cover all the edge cases with how repeats and multi-day bookings work.
Issue: 4521
If you have a workflow which a CustomFunctionAction, and click the Export button to generate a SQL file with the contents of the workflow, then you get an error.
Issue: 4527
If you have a custom function in a workflow, which has an argument taking a MappedInt, but that does not specify which Mapped Int it should be, then workflow manager will show an error relating to the custom function at various times.
This is similar to issue 4351, fixed in 11.0.13, which was the same scenario but more severe consequences. We now handle the situation gracefully.
Issue: 4528
When a booking is cancelled, Calpendo can ask why it was cancelled.
This happens depending on whether the resource indicates that it requires reasons for cancellation to be captured.
This involves two items: some text explanation, together with a value selected from a drop-down.
The drop-down causes an integer to be stored in the database, and this is from the “Cancellation Reason” MappedInteger in the bakery.
If a resource does not require cancellation reasons, then the pop-up asking for a reason does not appear, and the reason number is set to -1.
This can be confusing if somebody has configured a text string to be associated with the number -1.
So we now store a null value for the reason when a booking is cancelled for a resource that does not require cancellation reasons.
Issue: 4531
Sometimes, depending on configuration, it is possible that when you click in the bookings calendar to create a booking, some of the user names shown in the owner drop-down start with “null” where there should be the user’s login name.
Issue: 4532
This is an extension of a fix in 11.0.16 for what happens when you try to update the database schema or reload the database configuration in the bakery, and there aren’t enough database connections free to use.
Before 11.0.16, this would result in locking up the system so it couldn’t be used.
In 11.0.16, we would detect the problem and refuse to try and update the DB schema or reload the DB config to protect against the problem.
But now, we release any database connections that are not actively being used when there are not enough free connections. Only after doing that and still finding there are not enough free connections would we then refuse to do the update DB schema or reload the DB config.
Further, we have now reduced the minimum number of database connections that are created when opening a connection to the database from 5 to 2 to make it less likely there will be insufficient connections free.
For those hosting their own Calpendo, we now recommend modifying your hibernate.cfg.xml file inline with this change. That means changing the value for hibernate.c3p0.min_size from 5 to 2.
Issue: 4533