The rtd_assets() relation on Location has no built-in status filter, so withCount('rtd_assets') counted archived assets and disagreed with the tab count. The other two (assets, assignedAssets) already had filters in place but I added the closure to all three for consistency and defense against future relation edits.
fixes ##19235
We were seeing multiple count queries (two or three) against
our database when using the API. With this change we are now
seeing one query and, for us, it saves on average 300ms.
There is a new validator introduced that checks on object update (assets, users, etc.) if the company matches the locations company.
In case of the creation of a new location it must be checked that the parent matches the own company.
On updating a location a check for every related object must be made to see if the company matches the location.
Signed-off-by: Tobias Regnery <tobias.regnery@gmail.com>
Now that locations have a company_id they get restricted to the users company with FullMultipleCompanySupport.
This breaks backward compatibility, because before everyone can handle locations without restrictions.
Add a setting right below FullMultipleCompanySupport so that everyone can switch to the desired behaviour.
The default is off and the existing behaviour is preserved.
Locations are the last big part of the application that can't be tied to companies.
This can be a problem with FullMultipleCompanySupport, because you can't restrict the visibility of locations to the company of the users.
In order to change this, add a company_id to the locations table and wire everything up in the views and controllers.
Aditionally add a new formatter to filter the locations to a specific company, like it is done for assets.
Locations are properly scoped to the users company if FullMultipleCompanySupport is enabled.
If a parent location of a location has a different company than the user, the location does not show up.