Skip to main content

ArbeitszeitCheck - Releases

← App details

Nextcloud 34

ArbeitszeitCheck 1.5.8
Release Details
UpdatedJuly 18, 2026, 11:18 a.m.
Changelog

Changed

  • Mobile / widget home payload: impliedDailyHours (contract daily target) is included alongside weekly hours so clients can show “Daily target” like the employee dashboard.

  • Session CSRF restored for browser cookie sessions on NoCSRFRequired APIs: mutating clock/absence/export endpoints that stay NoCSRFRequired for mobile Basic auth now re-require a valid request token whenever a Nextcloud session cookie is present. Mobile clients without session cookies are unchanged. Forged Authorization: Basic … headers can no longer bypass CSRF while the victim’s session cookie is sent.

Fixed

  • Absence cancel/delete/shorten race with approve: those mutations now take the same per-user absence lock and re-read status under the lock.
  • Status-path stale-pause repair / daily-max auto-complete: side effects run under the time-tracking user lock without nesting an outer DB transaction around a second lock acquisition.
  • Manual time entry create/update overlap races: overlap check + insert/update share the time-tracking user lock with clock mutations.
  • Month finalize/reopen TOCTOU: exclusive per-user/month lock around seal and reopen; calendar “today” / month-ended checks use organisation storage timezone.
  • Compliance cron / weekly average windows: use storage timezone instead of PHP default/new DateTime().
  • Absence business-day gates: “today” for cancel/shorten/substitute rules and vacation allocation reads use storage timezone.
  • Dashboard load-error callout: keeps aria-live="assertive" for screen readers; clock/break buttons guard double-submit client-side.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature1YxfevMESrUM//nCGciUukkJUENnGK1Zx28RQDbamoI4ObbLwsvsf3iXtY8HSWvdXU/CcaaIkhoTz1AgoDrrc9hEuKgB5n+wLwSasEnCOFuEB97+cRXwPFInFhWY8l6At1iKRcfa6CI/dQoGL39p5afqFF9LNwASQj3t72wAGMFUn582kRolB1QoKJH5YisXq3hOUfkRRxmCE1QYV+UPeTvxhLvFZgN62CZC53ZQl7q7xVvPUIszduNjkdzfa3h3phb52+cU0XS5jd1KBXzJPdP+JKAo07X5ctW9w1N1A854M0NViBcm7OsWz91eQTI0Rbbn8AeClAMMX+hD/x5SBLmP1hw5sveGM6aX9W68rAqy7A1215xvAwqRMHHe6Nccd6zLFUvh9Ll2SEA6E3UNbch3IgtlhgnBxhOjZMrVVUjci82Ue0zrIN6MFLI5yCWYQ9c9m9hSfDeqj0X3mjD17uTsba3l0YgnBV6WkoYcwphvDETTEd4QRPw4Yy3nm5cZ9JvWN+XG2wL7xuCw7O9/rQAIjXDlI4FuG577wSjEdTcgiHMeHsB1aA5HKdxMyRth60FhJqEveOxOJ3N9RUQUTpSgzVbJxablgHSt3r4QABIWQahY79VYUDLYXmd05v+PZWAOWUHS6waOIdM8NHRIfvVLq3qR3WVoSftNVN3I1VA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.7
Release Details
UpdatedJuly 18, 2026, 2:08 a.m.
Changelog

Added

  • Auto break setting exposed to clients: the dashboard widget data (and the mobile home dashboard payload built on it) now includes autoBreakCalculation, the personal "automatic ArbZG §4 break insertion" setting, so client apps can explain whether the server may insert breaks automatically.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature3lsfEckilfrV40shkUALmCLcnU3GVW0m3VI/iRg1JxxcpMSBtmCK+OFGPo1fKN3Zz2gTicFaavr/4pfdl8oD2HUCMsRJtzt2URItVhM2cEybhBr3G1p52hQWVoFGBb/1QOKflxFcbSAf7QLvA92Cje+qb8TUjyM5uNKLqEq/jr9y9nEH4afvS2LO8s47+akQn10KnlROcuIb3S6wx7yhNQUFsHnKYdUetzZJgTCxBFFrQ0llfDmFAJhnh1GFypqZ9MPhjbXqQBJ/lB9Unk/pekQqxaMREBY/K0gG7JEhmw6SPWcX5aGU3hmKvFLZB3lfWgt2EH4viQ5c6F/wqkM/fRZqZ4y/0kLHgr0KxMS/iJBTOISyGFxv31yEHQGbrUo6Rfr/8TXFYGuV2f63CyZIEe1s8WDdsGkakm+OnJTLUo1Rxu8s2LbECQJWYpIA/Xn546opsRPFtGFPWAPKJesHjmut1tKUrctx2zJxU30GFOkQ+U+nRrx2HRYGhJze+7OKxXCaW9imtsheFdb2AoPBmj12pN3ZHMWKjR4Um+v7LWKbOKjo7wzNTL85PsVPG8pF3TZa72jqqOZEZH34ayeUiv3n0lmt4aStaB3HYwb1yZOjH1oVZOhKmunDs4+naRLLweixcYyICLpCB6IPHSeByvzFUqxfmCAtaev1arL6FvQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.6
Release Details
UpdatedJuly 18, 2026, 1:33 a.m.
Changelog

Added

  • Mobile home dashboard endpoint: new GET /api/mobile/dashboard returns the full employee home payload (status, vacation entitlement/remaining, week hours, balance) for the proprietary employee mobile app, instead of the lean desklet summary.

Changed

  • Time-tracking status endpoint usable from the mobile app: GET status no longer requires a CSRF token, matching the other read-only mobile endpoints (still requires an authenticated session or app password).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturejIqTDpn3RCL8GdRV6/c46TD79xYOm5/UalYDOBjwkEukzMomLSYYlii5dfXyu+2FaGRqR782SaUf4Wl7TM+i54puPCDo0b97kZe68crptjpNCuNqhGcVg0DF/mYOjDIANClix84oRtzf41Utm38ctMxHCMQ53t2U314oTMRlruIJjpRXa2FJbKKuqa79jxOy6iz/26LBnIiIVF0RXB34qBMaFxy/YzzR4uHVs2uY5wDZUe/hlViFk+YQlwFWWulU+7HHQ2fBhky85qDvx6PyEKH0F6pk0k/6EuWFY++nC2zoYXtVl3biDN9st3lYPPgNWF63fUv+H/fmI6+TqbDTOCEolBMoKJIn3nK0Rs+kHqKoulkgkhYFxr2OzPNRW1Nf3YhRfUmp2QRdWw17pAeYdiivxAMtO1wtv0UXONTfdK0HjXPXkMRlQiTYTXuzyL/ZwsYhqk++4gLCdgsAjeYI+jQOid99iSkxcNkj/4xZPkaWqnoy2ScJZdakCAcsfnkzASOdcCoKIrsKvvam84nrg1wcKVNYpJL5H4W8t/LJmmiZw3GMdV07E7htCfY+6Ky8Gb71FNrlIQmD72HXtGeC11rbxR7D6lzTTRdo40n2YqglNEEmknElFubpYlUoOhqdwy0cCdHhuZbw98B8eFmF+RLfIsfjGWNVnSFrSg8lSuQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.5
Release Details
UpdatedJuly 17, 2026, 11:08 p.m.
Changelog

Changed

  • Vendor public key baked into the app: AZC2 license verification now uses the production Ed25519 vendor public key by default. Customer servers no longer need AZC_VENDOR_PUBLIC_KEY_B64 for real licenses from SbdLicenseOps to verify. The env var remains an optional override (tests / experiments only).
  • Clearer signature-mismatch warning: the admin license page no longer tells admins to configure AZC_VENDOR_PUBLIC_KEY_B64 as the primary fix.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturewFtcvk8BSgYUH7erpstedDBkV2MaKJZrLLW9Co8vzmPtwMccIiEaPN7rasvZJsq53IjE+mDSK+BzwrueIrN0XnCCvONC0R6ywYLYMBhMxZsZDiZrFYlFVMvcBq0I1h5aGBPsiYO8WYqTBN4DnX/xtsFORpTKJ+IVSDTw/tsTE40N+MIA+aCe0HJb3QZHXziYbxvPSAZIe6dI/v0+Lquii1anvf9k4oF+MfIo8a/7DB7jhY02BQ/8by8JG29AG86oL6wg7IShtR9sZlYD6aI+TBAJ7RZebFuqtta68WyRw8FL5rVy0O8DylWOCNFWundttwkUrL3WE8Mv07Rm+TpJbQ4uc0YdoSOfK2KNhx5VK4zO164z6twBJgusMDQzCoBSfsxtal6Zan8ORNvdh0hA/MI9lYnWX7gpJPdf5FGFoUgc7Oi9ASYC6j0TQE7vUr5kC8A2AoMnjahPykVc5x70NEIW8kboeeC0HjKxg7MNXSaCOJ49+7X7GnXate3cOTBem79vC59a2VvHjefomThLIF9ucnWS9zNXwgfxELPyIsCyKdTjM7Wbg8uD9fMhYZVgDlMLaa6Trj5jPayHMoKMHVY+4Rcd+iTWyGuTqsdyPPZbU/qBJCEhZej9uG1A7U0Pyrd9M+X+uoTxqQlBPFj1Y0blKosk7lPl0Buw2LyKK7s=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.4
Release Details
UpdatedJuly 17, 2026, 10:03 p.m.
Changelog

Changed

  • Kiosk admin UX overhaul: clearer three-step flow (find employee → allow access → assign badge/PIN), richer status labels, confirmations, and actionable error messages (including license/slot limits with a link to License administration).

Fixed

  • Kiosk admin APIs required CSRF again: removed NoCSRFRequired from admin JSON endpoints so state-changing kiosk actions are protected like other admin APIs.
  • Race conditions in kiosk pairing, enrollment, and PIN lockout: exclusive locks around terminal pairing, badge enrollment start/scan, and failed-PIN accounting so concurrent requests cannot double-consume license slots or skip lockout.
  • Badge enrollment only on active terminals: enrollment now requires a paired (active) terminal instead of accepting pending/revoked ones.
  • CSV credential import size limit: imports larger than 1 MB are rejected with a clear error instead of loading unbounded input.
  • Sensitive kiosk responses are not cached: pairing codes and one-time PINs are returned with Cache-Control: no-store.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureRYjKQgR7fhhltR+3iZrWtAevXZtgWOm72Sm9yskWQtXfDgcNiy4umdoCjPrr28t9NW+DASahC11vAFpT65cBVz3/uvuHLPlKtmUTDVb0MYX3FBdOnyYCERerVayRuVBosDJyRSylAsdOoHdvdwVZGzj3P7QTtRXgG3ZvKpg5vTUAvg4H20JknLPzrIRFUslZasnpEcgRpG2WCKLVESXcwdLFG0HTJzrZTwsxAYXd+jT5ciaJD1D3WiMZAjcNEzrPwIxk+KsRJLi1Ni1GVVmFvENUflrdXtUWCLTiixzEs6fsS2U1MrtnJ5ZZxGK9iVH48scHpKiJ4lGiXp48d6wnBuINz7JZ2HIrYQrrFCARNCMKW7j+5Gh4B8w+1UD1t1OtVkrrhgGGPOYToj/+dDHBDNedT+pbAQZx3h2GbjSIVY3cdCD4GRwcwxAjSu5sj0pqmXCPr5l1F8v6ClqmRvOAfFvnP+NC9uO+rZELc0MKPwZBy1ezIgCTiXgVgQk83jyI7Tf4UWSgP4biSpVFSVp/fZwNIetxiauxchKsGMHxuRtQbzCklKylhwf2h1pVuR/XfkxwsxEj3JHeUNXGfH9V85FGjW5P6oKeQaA1lvL9rn8/UhZqNC+LynlwFpUxPwbh5HZkkUsFLFGdPBz/uAmCFnFbErvejTYZZcy7xs0sEag=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.3
Release Details
UpdatedJuly 15, 2026, 10:38 a.m.
Changelog

Added

  • Instance-bound AZC2 licenses: license keys can now carry the Nextcloud instance ID and are rejected when applied on a different instance. The stored license state records the bound instance ID and a fingerprint of the applied key (migration 1033). The admin license page shows the instance ID to include when ordering a license.
  • Daily license maintenance job: a new background job re-applies license limits once a day, so expired licenses or reduced seat/terminal quotas take effect overnight instead of only on the next admin interaction.
  • Signature-verification warning in admin UI: if a stored license cannot be verified with the configured vendor public key, the admin page now shows a clear warning callout explaining the mismatch and how to fix it.

Changed

  • Mobile license gate covers the whole mobile API: previously only clock/break POST endpoints returned HTTP 402 without a valid mobile license; now all /api/* mobile requests are gated (bootstrap, kiosk, and admin endpoints excluded), with an explicit LICENSE_REQUIRED error code for clients.
  • Admin license page overhaul: redesigned layout with seat/terminal usage bars, assignment timestamps, and direct purchase/renewal contact actions.

Fixed

  • Kiosk terminal pairing could leak device slots: creating or activating a terminal now reserves the licensed device slot transactionally — if pairing fails midway, the reserved slot is revoked instead of staying occupied.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureXXtpAkga7MSWT0URLIx8lfJZkYdAp/OPaGbSyuv7lb7HoysNfKpK3Da+GcKbi0J1AdJUsSZJl5Q0Repec5Hc/V3cnykiuQn97n4JtNFKljd2oyjbs7YYvBuqGO6qA+wgATsrWijAI7uvVQwytYa5vwA6+lYkeuLgKZ0jbnnwL9YNvrHzzcu/8JWxMnZXHTQS06IvyIvVlPqYAunMgjnMLj6s9sxg7NOHWE8m2WKh2kHsHVHcVK7G2/zEGkXAt4vg9MOe9p3laDtnjue/eVtpc4ynogL/UX4O+X+ulnF7cJfJCR4FCu0meYwMuujgvJ42uS1DeBlICnV4+dIn4rYhxc8V54BMjlhTyeKCLFMAgs0myKVmfHvOElDCkB1Pu8RJcv8cAzG0FAGzOzwXIzapVAzrokquA4zOwQY7fgMYyFSZAuAxHEfQfkuLeZNPP/jhOPgm09N0NdFwGxOhwVEE1MVg0lFPOj+imT2M8kHKVuEyLV3wRFGbVG0Jjivo0NFEVFDI9x4ibnR3ixHTQhX/+XnRmkujPVF9JAHhRZlr+iuS/mWT4s0IkgdPjFprOi9YQH2zC42lqRpJCLx94EMqcTTFdM3y/rxFfDG/YNJgBr5MJSp6K0Krl/wjoBuNne5gzmjGV1PcaR0IpFgI74dXHU20pXtMvALHtD84HibTgMg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.2
Release Details
UpdatedJuly 11, 2026, 7:40 p.m.
Changelog

Added

  • Pre-migration backup before app updates: new BackupBeforeUpdate repair step runs automatically before schema migrations, plus occ arbeitszeitcheck:upgrade-backup for manual exports. Upgrade backups are catalogued with integrity checks and covered by unit/integration tests.

Fixed

  • Manager "Record time for an employee" failed with "Status is required" (#27): shipped in this build (documented for 1.5.1 but missing from the published tarball). Manager-recorded inserts now set status and audit justification before validation runs.
  • Data loss after disable during Nextcloud upgrade: UninstallRepairFlow now distinguishes disable from explicit removal — tables and settings are preserved on disable (including auto-disable during server upgrades); full cleanup runs only on app removal.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureJPP2H7l2IIixMFE7YJqvF+iaZB8L7+/0QAVjcbHaR+qQmRK/KO8lGTe6Jeiw+L4IMCATnqctysA7LzW/vHlSgVGgfmE4/kpi+zM7tGMvqKv+cmA0cTVJQhBRlw0G7g7keeDLScbID1eAIXXsjRJ1xhpyfUGSFYX53x+3dnHZ0GBdDKCfd1z+yp++QiTz1SQuAqjubLUvDTd/6ZugplY96nr8z6IkpsuzEjgcdkvySyFcoJNCJXWZGFkLlD2P0PEANvVR3dwW9Q2FLaqfgGTiJJ2vyL+BkFsCO8jqH/WOfWhw82HZJ4qprYQP2H5lGt1nCGDhojHhhFBOj5DOhlo435QYSWEdfoldqCj1Nsg2uqunul3xSg4cVX0E+K/IUmXCtIxjlIPthkJaVw0G/EPHBLsQzNeByeSuGGBeUQSbZRiXWEZRn3wglPAzGH0XCzMw3vfcNQrzAKns50WdqzDR2Y4mpPgb+6+IeEWWRz2gPQn4/0FGCVKBX2M41ElLgXGzAMiehCRISCJwQboMBhHf7oq4Jb/tHqEf7OYFz1gGaKBrUArZ4bvHF0cUNPq200s1vN7Cm8jJZaMCQtk5VlEDzuwuwrq3RNqlUaPoBLmISp6lW9UYpkpGjg2257meE+D9H6vd3+0uj/0jP/S1+V59E1+Q635m1D03KZqKYt/Z42w=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.1
Release Details
UpdatedJune 18, 2026, 1:10 p.m.
Changelog

Fixed

  • Update to 1.5.0 threw the whole instance into maintenance mode (#24): the 1.5.0 pro-rata feature added a 9th constructor dependency (VacationProrationService) to VacationAllocationService, but the published build's container factory in Application.php still passed only 8 arguments. During occ upgrade Nextcloud resolves repair steps through the container, which transitively builds VacationAllocationService, so the missing argument raised an ArgumentCountError and aborted the upgrade — leaving the server in maintenance mode until the app was disabled. The factory now passes all 9 dependencies.
  • PHPUnit segfault in full unit suite (~test 583): DashboardDeskletRenderServiceTest instantiated legacy \OCP\Template after hundreds of prior tests, triggering PHP segfault from polluted globals. Template rendering moved to DashboardDeskletWorkspaceRenderer; the unit test mocks it, and a dedicated integration test covers real template output.

Changed

  • Hardened the dependency-injection safety net so this class of upgrade crash cannot ship again. This was the second ArgumentCountError upgrade incident (after 1.4.2); the previous guard only validated the repair-step classes literally listed in info.xml, so a transitive dependency like VacationAllocationService slipped through. The release gate (scripts/check-repair-step-di.php) had an additional latent bug — a namespace path-resolution error meant its argument-count check silently never ran. The gate has been rewritten to:
  • correctly resolve every app class to its source file, and
  • validate the constructor arity of every service registered in Application.php (not just repair steps), using the PHP tokenizer so multi-line factories and promoted constructor properties are handled exactly.
  • Two new automated guards back it up: ServiceContainerDiRegistrationTest (static, reflection-based, every registered service) and ContainerServiceResolutionIntegrationTest, which resolves all registered services through the real Nextcloud container — the exact path that fails during an upgrade.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signatureu5YINc+PuS8hHrWz7yL/oEqD+JdCNSs2Gbuid0nMbFunQitWqgtsSNMPExv2ORm7Ll14LcjREkHyIRc0lv7px2fEXeIAI2rpvSf8NFAoamhuf4v4z/jY+LxxVyjkhhzWlX//Aar6TjUBLD0xk4MjOophqPY+f8ObHyW4SzSWMuElED0glM385ywWWwfVHbY5UWmzGwZ4qAAmshcE0tt2JZrlSAWXFUuTe/FdUKnUXoDVB9ahcBPitdxmF0UFHdX1+4OjSP8fu5m8KoMlM+qcZp9Nr9xxIiBZ9Ew4wnmhDq4cQqMzaBVMgW7gVv6KtehmP4W/3Hhyrtl5tUOB4cxTpnP1vNW0HMNgrNS2h8xsufOz0czSktu7YRstvcW95RWe9wZjH+pDwysBo05YfZPopBIu1eky+tF1jsvyBk9Z+aB6LnRTZ1qbtPZxK7Ce4QHsKzwTjtx7R/So/VUdSH64vkYI27ODmqn7rSjcmwCVbt4NDU7fog+47zmf6yiuML6GwUUQBdnMc5LpDUaKD+p2QdOzvQvU5ShCG0b63sTwHFBcG1KsTrIrQpG4BSF8wth7Uo58YmQHFX3G3Nk5XE02piwmkiySCTyLfTWd7bEu8AUrg71xJtVwrkXkgUmG+a632wfGZMvHHzv4A4r7pnXpIvKRhzmgGaB8Ap7GYxGXyf0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.0
Release Details
UpdatedJune 16, 2026, 11:37 a.m.
Changelog

Added

  • Pro-rata vacation for partial employment years (#23): employees who join or leave mid-year now have their annual vacation entitlement reduced to the part of the year actually worked, instead of always receiving the full year's days.
  • New optional employment start date (Eintrittsdatum) and employment end date (Austrittsdatum) per employee under Employees → Edit. Both empty means no proration (full entitlement, unchanged historic behaviour).
  • New global admin setting Pro-rata vacation → Proration method: Full months (Zwölftelung, German default) — 1/12 per calendar month touched by the employment, with a fraction of half a day or more rounded up (BUrlG §5); or Exact days — annual entitlement × covered days ÷ days in year.
  • The admin entitlement preview and the employee-facing "How is my vacation entitlement computed?" explainer both show the reduced figure with a clear note, so the displayed number always matches the usable balance.
  • Proration is recorded in the entitlement trace and historical snapshots for audit purposes.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature04r3eUzf162DBb4dMPJS7sQivJmQuO0es5mnUkPeRArAB+uCEbjQ3bx9btbltRYiJEug5fBGCVSr6kgEdSF+kmTmsk4hsAnISA4gUix6cFj0aIynbPRlYoq4e2W6IORRT6/U6DtM+YWGZxWKc6pe5/3oZEwk6RzRin3ZPcggwNY19vUaT1gHCxewODk73kf0x6FWLjFrHi0r0GZ+ukGlOt3xcPaGqjdxtcSN0QaeskEd8pFJS6QLVeXL2+IYrc46PrqvvV1Sk07ivqJJWeesmj428W2cdcnyKAgBOB6pjkJBCevoV4PoLfmorojPJl2Qpms0/0TiJGyqV+EaExfWRLPxLFwmdPd6hBdT4s36giR75jOdklf/G1alKrcttNnRLzpjYUxyrUElB9DHKZhdKWiJOAHaHvTe2j3OPPF0gFwxCaDhrlDL8Yc6lBmIxwX6Y+Rer9/e1uhnykn5Ww2jIYqeC+ASqsDiOUhYBLKab42v8xlhK60hMMiZNpo3fIwpQ0/LQ/986VlTSPdjsPhjam+W8ONtqMFnAqRqxonAhMxvkOX0p3Rw4CdL21eQJyzeX+XACQEVENRqk3vQD3xev5y1sEFlcXxk75ogpieOfefiiysRWTHR044qYBpmHmjAn1qwwHf5oqo3fpIMZgTbsMzF7ZCluS09QQPXpE3eZsE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.4.2
Release Details
UpdatedJune 12, 2026, 3:45 p.m.
Changelog

Fixed

  • Broken app upgrade (1.3.x → 1.4.x): EnsureArbeitszeitCheckSchema was registered in Application.php with only IDBConnection while the repair step also requires IConfig, causing ArgumentCountError during occ upgrade / web updater and leaving the app stuck on “needs upgrade” with missing navigation routes. All repair steps from info.xml are now explicitly registered in the container; RepairStepDiRegistrationTest and extended UpgradeRepairIntegrationTest guard against recurrence.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureICs/E2o/tBf8TpCMYgReOuPLGeKrhCplYvNCM5kbNkP2HiqQRJpD2qPTc+fu2RgHBDtAdaahVDQfB6VdgqrhRMvFQVzqPTmRdNxjP/TJT6YYGllKwikajxlZVAL/05Duo9AyxWzdsjtM6R4WfUK3WvfMY2Mc7fd1JTmiVpAuX92FujyNmyZSh2NF82R4wU+IZiwK4elYnfxn4At/ebMmLW3wOLh/tfPPSlPGBBjEfmG8XMLf2y3fK+wFG5P2Hfr+NXWSj5xpRmXOF7lVfOFpD3r6/CN+RLy1uN9JWzcnL9SPNCgCTLblCyLDKv475PsGOJl9wXGnP9eFLxpfAAKIY1aspOaaX14XXVWMN4xqyCpKuJbdmalS24vKr85Ln0i1hkad00jLvPcCTOlLRfdogfn0ISYBNd+t8ifSWKEIw0geROiHVpUbGjHlPfizDkqLUw+k5ha0UJfoy826uoE7ewgO11uWR5pQ7y9+nClCrclHi9y6ULf+NYYJlCykzqCMQru4UtbDmmHG8nlBYWQnOo8GqyYhroPkauDbPrdoP36wOrX/xjbnewtttQpYgAHRU8q7I9OJ4Mu8WH0YgUym/AjuKpDkR+74A5HEvwW53X1Bah5660eGr1ZKPjpDdL0sG7UMoNHLzU/Yd/7LSTqqj4Nk4xDa0cEEukq+mVXLvMI=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.4.1
Release Details
UpdatedJune 12, 2026, 2:57 p.m.
Changelog

Fixed

  • Data loss after Nextcloud upgrade: UninstallDropTables preserves tables and settings on disable (pass 1); full cleanup runs only on app removal (pass 2). Fixes auto-disable during server upgrades wiping data when the app is re-enabled.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureiQlJrDXH7/uhJKsNav1Z0nd0WyEEeiwHOpwkEyFOxMEmxO+H7/ivVzHztsP8NJ1REWySBC7mN+WM8LcQxbVYgCY6hBWff6Bbv3BJgQLAkuqUc6onwZ2tAzaiuR/S0HMEPnCQjAcDWc6Jt7zdt6FjWgXQa35VP9/Mpui149Am3qwy5uhqLJeTo5qlKwMELHiG5Xyz+/9kUVgrk2QhfmK56LonLcDRhXIwyoi55nmwizFKFSvJ9zjWVhc3MIl+dXAxg5ZbSLrLmvnoJsDIEJDlh752mlm4Fx8+gX294Kc6WBg/nUIMWggoKJCHZI3pJ45GRxewYJsZs3viwR3k5rxtLwyZu+McnO2wz8RTC5KZdw6svEUpAORNxbnbAuqlJOqbSppJjlGW8jIKopLWwg55vo2hsf3ZaAuhsWy5/afb/b9+TFvlzSJmptWScz4R5sIvdLWnisas7ayRWO4xXi89VrTukwGLzbjXJIhHGp+U61/5uLu4A3PradgnP+qtg2zps927MDjgdEjBYjWw7MXrVds42/rXBRtN2VPnj7ou9cuFJNkFf/GfBaWRU47AxaXlEWz8nUTEfBnQZb0ugRuSRkqtWYMpYVv8A56EyjJABdpLyUjRu7MwSQN1PRBCIiMZMK+9BLeK4sgTzS2FOLtue76A9jbqUafuiNnGAsdd+nI=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.2.6
Release Details
UpdatedApril 24, 2026, 10:32 a.m.
Changelog

Added

  • Absence approval forensics: Added approved_by_user_id persistence on absence records (approve/reject/auto-approve), with schema migration and API summary output.

Changed

  • Vacation entitlement snapshot integrity: Added deterministic key-based upsert on (user_id, period_key, as_of_date) and migration-backed unique index enforcement.
  • Concurrency control in critical workflows: Absence create/update/approve/reject/substitute flows now use user-scoped mutation locks plus transactional rechecks/row locks to prevent race-based overlap and over-approval inconsistencies.
  • Release safety: Workflow/unit/integration tests were updated and executed against the hardened mutation paths.

Fixed

  • Legacy snapshot repair path: Upsert now handles historical malformed rows and concurrent unique-key conflicts safely by retrying as deterministic update.
  • Vacation balance write races: VacationYearBalanceMapper::upsert now resolves concurrent unique-key collisions via re-read/update fallback.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureFCaNQEccscnzM6rLSgigNgiMK//Ogy4aLpQQ02I290SKuEd1galIkTleu42bUC3jUHSHpnmIDlaOC359unS4KGTEy3nmCdndzTjnZo6r+Pbk9+/vFkufLmhW6rckhWRuZ5FaTDQEtSuZXf/xGdfbdoy0emnIb+n76unzaXXDRbRwiofg80WVWY3ejgfixFajIBo0pYBiWHsjvjA66KtZXYxALqBikSLtr7Qo2BNssYqyDpxnPXjrpabkjwefBgBEro9vtBMgdxO1BiXf2R7YQK7tdea1b1+Z0SPhktPHoetniDAHnLzFucaQdwMVT4jiqwldo5wArfOLOWnFHa3jBDLUVc3RCov3/euMcr2GKxwYR6Zxjuwb++CAMTv4wKuKhju4tfWm6KQfUXCVMciK56XxAvwhf0FzlGBpT0+YORUBc7r0OSm1SbO5R8E6wOF6sUM9QhQCz+VFFyo5QEXxME0pV+yDzFFCBCulYH5VFq+cTXXZ9Cg7LaafpLP0dm3xJ+bnjLf/sNziApiMCQsOvK5DQ/tH6NS1qf87PZdb2FeciFFCO9eZw5JP842ePPPdbfq6hhz36BOv2gHqY3b4ze2H8Jp08II7/a3FWKbkz0nXN0G0HLQYDkBAa22Sn/c6Io6hGcQI/0fuW8pHJjhI6VgoCZpdY+dVD00/7Pu/HXw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.5
Release Details
UpdatedApril 22, 2026, 7:23 p.m.
Changelog

Changed

  • Release packaging refresh: Bumped app metadata to 1.2.5 and regenerated the signed release artifact set for App Store and GitHub publication.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureZpb9Oh1bIRpGiO5z2K6o3xhzr43wa8RdfzfLXHg7sEGwS8tzN8GaAdyCnk4IoZbFQbrcrwdyFCK2ifzBqN9OrxHGAqGpFLeQOaHUDcH/imXCIFxYAch8kwW545iujuTkvSBdlIFa+DAG6lFFRngQPO2aO9gC1B0Vp6wLTAjI5NDNeM6nVNyCIhbvaC4jUfIrTjrCfvgQ4hgpJ29pYU0GdY6bEgwKCQQgUuJVEB6Hoay1M40Xq8eLzdT/UfobFlC1nV4Anda02g1AeoM04FrJQUfD6lCo0s5pFYAJ82EM5OyzWwi/xgEv4y54tao/UBX6yoUvIdHa7yh6bfoKy0dQmzb+iHl8eQTAzCVQAgWWu58F5J+k884kYMwBNBdcuymPnszTlypmrQoRRjvI+UI2f8taEikdX2EUAbwHkBU8U8CG98NogPFy/w9drgLqq6gvBCtuuz3BLC7fsEfA2/Lx4XYEwCdbvoFMc2GNZJMIujhs1jsbk0Hzscz3NCmaILzbZpfKr59xfZy/bxNl2Yi8nl6L9tJRyaLdxJ7urZthACHIdATnAqGretxEcTox69OnoR+Pir+0N/8ujZ3Z2K2C/5zu/QGwGgaz+WeoKCwGjmTb3JCG3jh340kFLnp8TnzUiZpduSj4Bz4o7yojTzFAPoQrTUYZrv0llb8PGSoPI8w=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.4
Release Details
UpdatedApril 22, 2026, 7:18 p.m.
Changelog

Changed

  • Publishable release refresh: Bumped app metadata to 1.2.4 and generated a new signed release artifact set (archive, checksums, and App Store signature) for App Store/GitHub publication.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturefOspm7RunA6JBPSZZ3vwdD+rRVZ5qOeMbZFcndytc+ZU00QoTdCYDFaEsDlUZtuCnpLGgwQ1x8o0jBhi409JtsZrNyD99XhzBZCKNl/nysKo/jDLa3h1msZ/AWKtjJUlyLxEPvPLzM2e/bg7DVOJKi0lsvq6nmUxJEhlLmhdgaONOlbAsBdtrtTKOO7DSxslFRRW0fmofVEdH8lL+5y0l/RtV5Gd6bMtpQ5bzHSoai9OMuOBFJ98QX9k/vX4qAuJUGVRvivJmMXDmiD/kPvezmia5no32RbXtYgYBUVY3Y9kfOza3mdFIwlHSD0bnjCI22QWUCBa5v59k+OuMPzPxCy+bzBl/M6Fu09TrNCDJvejpF/y9vKl7Wxgdz4ynaA2EZZ+RN15cGiTdOWVzjcWtnXBMSh9RCnBZqSCz8dFq1qVLUy16lBciLRNa6HofkEvemUN1oLbokZKLQlyXMFNxT8Ny3udUaOa5qKFDLbwgTttFuHDfn4NWOeI7JQgJ5kntg2KMpB4VYXvDwODCEcolniDL08kWuPbxOxd0tTR55+seYBfrSQrrGt46a4Vcp683MvMn8fx/el7vSPx9ifD1cUd6KMf/fi5IJF+pohxoCZlNepNdQGmaKNfWh87EGsdUl7089uKLWdwGWeGoHdxrBuRBhcfIU1HvCH+KVcvT9A=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.3
Release Details
UpdatedApril 21, 2026, 8:11 p.m.
Changelog

Changed

  • Release packaging refresh: Prepared a new signed App Store/GitHub release archive for the current code line using the Docker-based signing workflow.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturexYrrvEAHPwtfVHCBhNEEi7sX2LvqPOYNCC1AOYXNIeoRkUCxYLFTc29MwrgaUMoSLGtoZDChDD2eKsUH6MY+y5Jk79dKZg/ngf2/YBQpmMevl8Lp5eSGo2QES6rBtWYa1GFOEd6sVU6RLcy9tNL3toOxw5Te3QTskzeamEGChd0JYprcLZSWJG1kRu8Y8c32p5Rwbwu1tuq3AAW+i/6Bq4bxztKR6PGkZ6uyTbVaW3p0PwMFoJxceVu0/MsbMpftQaGQHr/1h6nBvbuj1WBkfi9W0PHrl+0zRn+5FwoUU9dECfeHuQAAcXOcJsKT979ewplb5+vPgNSeN2SSTWoGs9eYYIvUzznpyhuqSa1aplwXO/U0xyTXeUE5fiAQFlbnxtZ7gjmeLBkbAR/gF4aCX3NEPGLtw24gY8jomJ67+foeoM1+AJM73aFgTH0NjYKUetACRTFgB6gJPXl97JrJxd7sTeg6xiqlNKrWSvxiAO8XkjHCUV1BaPmoRtyfcNnLxmf0MGCVUuO4btz7JH5qy3q4H8XecbNYpnEeer8qxzTkw3toonE4+LVgbHV0nW6uu/gfEvDtYZI0wKx/A4vQYSQ7WEprMn9SbjnXbaMFOcG81GT2HifhcWZH0/YfFzz+sRng/TvZOkuf2iUq/9EjnKwkyygMSlHE7Si3kYXldKc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.2
Release Details
UpdatedApril 21, 2026, 8:07 p.m.
Changelog

Fixed

  • Localized decimal inputs in admin settings: Daily working-hour inputs now reliably accept comma-decimals like 7,74 and preserve two-decimal precision.
  • Legacy hours API payload parsing: Time-entry endpoints now parse optional decimal hour fields consistently for both comma and dot separators, preventing silent truncation in backward-compatible request formats.

Changed

  • Input precision hints: Updated settings input steps/help text to align with two-decimal hour values used in 38.7-hour week scenarios.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureeG9EHR4R6Kg1X8OQ9g5Q0yPR7Y7yp+snb/sVhhLXEOtBIFd4xLZd/xi0GuLYF4KBZlPCH1GbRCy+q/kbjx7MyqlO2rHn3Cef0MnwJoLp9czZFJOjVJJpkoZNf/o9hh2OpeK+sNS7ghXfC5Pax2oicQFmeQeKQKLaTwn0AcJgvQrF1laVjQiXQopE98v16iClBjZ+KuybKcRmglxbd1N8dx69nBB0uyLQdkQIhnwHccyrlPCBzsXq55AtIEXGsitgXtquHKOk1bzBwM3uwQZoNRi4RIB/zWmOv0c7+71QTw0i1DMUsz+FUrTw+bBY0FnZe/Q9ageaUvwOb4bHUJYt1cuWPGEufAUC1w7ONCfHGASNkDv34msX4MQEaMf28k8ohtWlX/fzNIxL63Erijyanuo1tf9hZFeYEXmCKwXAeWOL0O/lXWcTGTvEOAD96sSv6RIcIOwHBLqxGUHiCQzJkKZJ3hjv3rrpOeneCLOz/jMNJrEgYCihLn1J8cUEPPeP6VH3rNthDuQOVCi63v+0X1uubbM6DQheViBYTA/z4wEAP/2YsA6rsXATB0JR4pOIxlsiT0MgjxIyrfctOJP/4zMU4645rSmZE+NS0TF46gpf8DF6ai0zilMmaHf9xY72qGZTICjvtIUcmwbMhRMqG9fmYomv5U2/jd3rubayPDg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.1
Release Details
UpdatedApril 21, 2026, 10:50 a.m.
Changelog

Fixed

  • Paused-entry recovery and lifecycle: Paused entries can now be accessed again in edit/delete workflows and are consistently finalized as completed when edited with an end time.
  • Resume behavior for same-day paused sessions: Clock-in now resumes a same-day paused entry instead of creating duplicate automatic entries, while preserving the pause gap as break history.
  • Historical paused leftovers: Added migration Version1020Date20260421000000 to repair all remaining orphaned paused rows (including cases not covered by the earlier one-time migration).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturewHjRsCMFlhEA9EgrgvzuDGiwQsEIOmqNFH9oA9Fs+lJZOluUc6XSmPeZow7uso0PwR/b5YYt+f8KmOoIwuJepnD1TTa5ClzBP5zx5gZq+KIloaEGzVPTnHvHJuc4V8q4A5BYEXvYrVvEuPgufr8BOBNy4SLwMKYQlJR0LhDLn3ShHowJ+VDaUSUjOtUih0uUCsNI54HhaAAa3EfKpgDqc2+jhM7WvnIzDGRVYF4HbPBYPpn+1eWOyOlOgq0YIy5M8+4shNLiGeIRo7Uepk9+HnDm6vjLdYB2iE9AMl+vSCGSdQTrP0Z5ceXZBZT/bM0t4Af3EfAP5seJ/sSQIYs1a5T8RIneJ7DwyFbZdGelFSSBZoMGDevr4IUUfAB3NIKNlPZsxAOv9elrF4AjLJZhDVB6i7OSVeER7yLqrIgMhBFXiFpr095gYQ7Wn6VCcBWwWVS7cWXa0xN9Yl00mn0z9GcVagRvncJ28Y0wSgk+GP/BDalUHmD7wHSL3pyXIWxpqQ2OJHi/xT5Myx4T+HVsywgRwAFaOLjV+hm8hkJLxd70WG0e1oo21m/DtTZZ1R44+BDdRGMJIcabWxJ/zFhYSZvVmoL2dpUlJhPgBBp1Y9Xp5pF0zOeLiGSMR4ON/Iys2jpsbAd0/TxW55NaEFOpZRRNYt3VoZJ8oqM1n1sHZX4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.0
Release Details
UpdatedApril 21, 2026, 10:08 a.m.
Changelog

Added

  • Vacation entitlement policy engine: New policy-driven calculation flow with support for manual_fixed, model_based_simple, tariff_rule_based, and manual_exception, plus admin simulation endpoint.
  • Tariff rule data model and APIs: Added versioned tariff rule sets/modules and admin endpoints to create, update, activate, retire, and assign policies to users.
  • Entitlement computation snapshots: Added persistent entitlement snapshots (at_entitlement_snapshots) with calculation trace/policy fingerprint for auditability and diagnostics.
  • Admin notifications page: New dedicated admin UI (/admin/notifications) with HR recipient + event matrix management and a dedicated notifications settings API.

Changed

  • Vacation allocation integration: Year allocation now resolves entitlement via VacationEntitlementEngine and returns entitlement source/rule-set/trace metadata in allocation payloads.
  • Policy migration compatibility: Existing user model vacation values are backfilled into policy assignments during migration (Version1018Date20260420123000) to keep legacy installs consistent.
  • Admin settings flow: Absence notification-related controls (carryover expiry/cap, rollover switches, substitute-required types, iCal and substitution-mail toggles) are centralized on admin notifications APIs/UI.
  • Working time model schema: Added work_days_per_week to at_models (Version1019Date20260420150000) to support entitlement formulas.

Fixed

  • User deletion cleanup: Deleting a user now also removes vacation policy assignments and entitlement snapshots, preventing orphaned policy/computation data.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signatureu3gPfbToOow1ecZSrYUbhzoOp6/Fb3syYzSdx9CNYBvsUDqkoBODyN714AKc/4PF8hYrf+nk+A7ICF0GC94uBW8MsNWCHRQ1GEmhhaNSePTNjV+JCCOR9SINE1JCYVSh4avkBX7evJrRZFTOoxRGZxKBSY8ubYG71+F/N22A3qH8wzu6yYMBi0hrt1oVOfFkhrkBKeEwip7Bm0vrEzfrhnNJ3qsqf5q52F9sxUFZNT+/JLDBPu/ZAokssMJGTgbmKwdc3qQzdI/d0zNPuZJwUNjjgvU+TLeFJRkOKNghRfdkVotVcm63NmAf9afJJx3QkCTOTbMchC9sKyvlnIbG68WUZvsiAUPRW5o2XxXK71zZo8y+GC65ZazjioV/4ANt6sEItnJ0MSylRmWFEXMTMJHgCiqqp9hwZwxs0IicHLsRRsnUDdT7yMgOdB7082cnUFJtWM9Me2uSvYx4QUfPosWZhkMqpwagxJ80EnYSfc12/cEXbr58MbdqyQeCj2dUG1iBPw0eVooOWxf9UwOnNaUKV6ynEGok/mYM3qS8XnNElFpliKoRAfBtgLsCpV7O/ChhjE0gPNILNasGMiofSaAd4cHZjSZI/7Cm6FkOSrGju6XCPubM6XeYLbyZ8pv1htd1H1NzUIsWYXG23nPhICNAdOvEcbIXWEw8H5b2Xtw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.14
Release Details
UpdatedApril 14, 2026, 9:48 a.m.
Changelog

Fixed

  • Approver deadlock (app teams): Absence and time-entry correction workflows no longer treat “has colleagues” as “has a manager”. Auto-approval when no assignable approver exists now follows TeamResolverService::hasAssignableManagerForEmployee() (explicit team managers in app-teams mode; legacy group mode still uses colleagues as a proxy). Prevents requests stuck in “awaiting manager approval” when nobody can approve.
  • Time entry corrections: Same assignability rule as absences (previously used colleague IDs only).
  • Admin users API requests on /index.php instances: Refresh/edit/history/update actions now reliably resolve app URLs and no longer produce invalid requests like search=[object PointerEvent].
  • Admin teams and settings API reliability on rewrite-less setups: Central URL resolution now includes a robust /index.php fallback when OC.generateUrl() is unavailable/incomplete in page context.

Added

  • Repair step ReleaseStuckPendingAbsences: post-migration repair auto-approves legacy pending absences that still match the “no assignable approver” condition (idempotent).
  • Frontend URL security guardrails: Shared AJAX layer now blocks external cross-origin calls by default (explicit allowExternal: true required), with unit tests covering URL normalization and external URL handling.
  • Lint guardrails: ESLint rules now prevent introducing raw fetch('/apps/arbeitszeitcheck/...') and implicit external fetch(...) patterns outside approved abstractions.

Changed

  • UX: Absences UI shows an informational callout when app teams are enabled and no approver is assigned; detail view shows a defensive warning if an old pending row is still stuck (until repair/admin fixes team setup).
  • Frontend architecture: ArbeitszeitCheckUtils now provides centralized getRequestToken(), resolveUrl(), and isExternalUrl() primitives used by page scripts (admin-users, reports, settings, validation).
  • Mobile UX consistency (WCAG 2.1 AA focused): iPhone-safe-area-aware spacing, improved touch targets, clearer section rhythm, and better visual hierarchy for normal user pages (dashboard, time-entries, absences) and manager pages (manager-dashboard, manager-time-entries, employee absences view).

Documentation

  • User manuals (EN/DE), tests/WORKFLOW_ROLE_MATRIX.md, and developer documentation updated for assignable-manager semantics and repair step.
  • README and developer documentation updated with centralized frontend URL policy, strict external-call behavior, and mobile/iOS layout guidance.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureVBSDJh3veK9J7eUDKGFw/xB1ypmBQrjMDzamatQfncYem1qg9kNVWAnHDH+fGRlFJtrBH+fOu+MRTFZuK78DU/W18IQglCtTbsH4MdaHLHTwVz2JOxeGJWmx2p1yK0ulK0vbDgCLXQu5B8gR/L/JYRGFo0+FpwuRvxrpp1BWrX5m9mQLgoxn3hOj2r+F2m0wYdEDWhksF6VzLbHyr3pIT9hu6p1owuAZzr3Nqtva4tZK0WGgn8xa5bDwZqJdWSyQJ04JiCZisftYCOJz8HNfq6o4MFTLF0aQpYxUH8wf6gz5pkfUOKIemq4Ui8GqRr3Fxo/DW2APAk0GcwWyY8ypEiY2RNi6IkGv3K9p8mFamDxirDeurOX/hwNia1Lt4HCqzJATjWpmaCEAoBQWfOCgozI9o+h8cI9LhHp3LvK3VxFD/s9xjJPFLZ9y8b98hufe13Uq5/NYzqo2vQ1DgQXyCbRjsiMbqDvz+yyDmXM+JPV8U8gTKxTD8y19VoiVIlWhAsI/zBmxHC84G2htaCHBws47cGhmJVvQDXGz/1aae9J0of1bGoOIERyEFSOAzmUN9fcvdVbN+77wn70QQ1k7GQcw6jAEScIQq8Pt8n7pBTECeECk6K4baNfaTT2+kZKLCdD1mdaJII84B8+XXxmxIk+VI1sarNlMIvPAk3FQjww=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.13
Release Details
UpdatedApril 13, 2026, 10:46 a.m.
Changelog

Added

  • Month closure grace period and auto-finalization: Admin setting month_closure_grace_days_after_eom (0–90, default 0). After end-of-month, employees have that many calendar days to finalize manually; if the month is still open afterward, a daily background job finalizes it automatically (same snapshot as manual finalize). Pending time entry approvals and open absence workflow states block auto-finalization. Reopening remains admin-only.
  • App-admin allowlist: New admin setting app_admin_user_ids to restrict ArbeitszeitCheck administration to a selected subset of Nextcloud admins. Empty selection keeps backward-compatible behavior (all Nextcloud admins can administer the app).
  • Security role-gating Docker test target: Added scripts/test-security-role-gating-docker.sh wiring via make test-security-role-gating-docker and composer test:security-role-gating:docker for fast authorization regression checks in containerized setups.

Changed

  • Month closure UX and API: Employee UI uses a clearer card layout, visible feedback for success/errors (WCAG-friendly), server-driven canFinalize with localized block reasons (feature off, future month, pending approvals). Manual finalize rejects future calendar months. Absence workflow (pending, substitute_pending, substitute_declined) is enforced alongside pending time entry corrections. Unauthorized API access returns 401 where appropriate. Admin settings: dedicated “Month closure” section; grace-days field stays editable with copy explaining it is saved even when closure is off; reopen uses searchable employee picker and clearer administrator vs. employee wording. Form validation error callouts use higher-contrast text and tinted surfaces across themes. Auto-finalize job logs per-user failures for operations.
  • Release/signing workflow hardened for integrity checks: make release-signed now signs the extracted release archive payload (not the local development checkout), validates forbidden development paths are excluded, and repacks the signed archive for deployment/App Store upload.
  • Admin authorization enforcement: Access to AdminController routes now uses middleware-level app-admin checks with a dedicated exception and a consistent 403 response page for authenticated users without app-admin rights.

Documentation

  • Deployment guidance: Release docs now explicitly require production deployment from the signed tarball only and document the common integrity-failure pattern (.git/* / node_modules/* lists) caused by signing a dev tree.
  • Deployment helper script: Added release/deploy-from-release.sh to deploy from signed release archives with safety checks (forbidden path scan, required signature.json, optional app disable/enable and occ integrity:check-app).
  • Admin operations: User/developer docs now describe how to configure app-admin allowlisting, what the default fallback is, and how to verify authorization gating in Docker-based test runs.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signatureol/yHOgiMCOj+yYqb8HC0g5laqPih/kTTbBB12bDawwgGQGVdx+GCBNaSmM8Sgu2jRB6PJWwnF1qFQQ6MIHWCjFzuOQeyL+sDEGH0VhI/qgbCmyRKZnBKAyUq9BBrxux3zaI6cN6QD76nP27UCU4C/OxW87nybYxy4WqqdOSOR0Af9QMkUg/VZLhRatpageqRGkYSFl+3ZwEg8qhlpDyLH3lh3xSG6+tQsyy9yU4La+XDiZ63lG2yF1RWHQ1/irb+dRrPEs/I1wuLvdZL+6olqx7MTogIylUqrJyux7ycTUrC/sxTBsZYJUQ2vGFyGzO30qARQ+KSOJtai5Upcx7WZxHv98eS0X3FGI0QUhC2NwIE2ahn0mfH/YjuRW5wBn9nsDG03KPpDaMATyvxTD8BbzGTM9ziuMKfOzd2HfYxMWDX/GF4LWM/eXpqsO7E2veMjtIClAcMI6vZhJKVV4mxXHxMkFIdvTbaFmPrWEAhFRoI+0NHQ4y3ec+goBucU+E4gHCyicVOT0T4n3NH6U+nOs+95d5cSA85Dz+LF7ZLLYU/rxi1ybC36fVg8igg+P8YvH555KQNizrYNJ2xdglmirJcs0XcEwZ8/hVrWfzuLUgKbMNXlqa2dgRzMnfOy9b5bNUPez9FKsqEqAc66dUr9JnDiR+poFgQBlCAnZ7vbw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.12
Release Details
UpdatedApril 12, 2026, 4:25 p.m.
Changelog

Added

  • Revision-safe month finalization (optional): Admin toggle month_closure_enabled (default off). Employees can finalize a full calendar month; the app stores a canonical JSON snapshot, SHA-256 hash chain, append-only revision rows, audit events, and a minimal PDF download. Finalized months are read-only through normal app APIs; administrators may reopen a month with a mandatory reason (audit). Monthly reports for a finalized month use the stored snapshot. Database: at_month_closure, at_month_closure_revision (migration Version1014Date20260409120000).

Documentation

  • User manuals (EN/DE), developer documentation, and compliance notes updated for month closure, retention context, and limits (in-app tamper evidence, not QES).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature0mCLz3x6v/VzKxsK9I8J3HAMtz+lr9Z43v3UN+tH4hZeZLXvuXWayTxLB6EYKXXnNSfkvF5KMiYJqh3LJHUCTcPUgGfPqNDwCkkTK51T0cmghwWPQylVIe9L6My8a2Pu0sVCrG5P0Ev5t7wdLQNMSxKcHYKXYT7B2QvQG+ljdNKr1/ywfXDEpIg4yzCMnxVdfGIBiUNl4vUIYOXCNt30fUXiRCXHfl381LcA2Bv9ZP+Ddxk+qEpa1iuujWcRg6o32YRCESwDAO2IoXKEvLy16btLtNQd7wL+E6lhCfgST/jp+rWPxh4RSJ8kBlyaBYo8LqvhvMRpGqhYfNOJZTrq0BnKQZfjc1qnAcIHMDFjBfUwi8tp0/bmxOnXmMMFZZtGf6rGLUYinb470whWKydzhIib2K2kSTN9GrRvjmp+osUh9/qAlBzN5wRutIBewKqM8SkwJ52dYiYWU5jAyf3fVxXqRJs970WUccI7udQ8A7J9XqkmCRUBvl46mPugz0K481/X6cKHiZBK9681njxRWorGVGHpCiz92T+Ug2W+bRIBYLBM0oqPd9Dp2rXQ5+UFLDTC9eDG8WP3VVxsK7d5xtK/xWC1fSHy4c7Mgp8WAVITY1eU9ftn1tS8BHZxcgz7EvgtPmamoKwb55KKFTxQu4c6khCWaZ2pPQvXQjxtrNw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.11
Release Details
UpdatedApril 9, 2026, 2:45 p.m.
Changelog

Added

  • Manager employee absences view: New in-app page and API for managers/admins to review employee absences with secure scope filtering, pagination, and localized status labels.
  • Working time model copy flow: Added copy action with modal UX, unique default naming, and safeguards against duplicate submits.

Changed

  • Manager navigation structure: Sidebar regrouped into clearer manager/admin submenus; reports moved under manager context; compliance link placement adjusted for reduced top-level clutter.
  • Manager employee time entries UX: Date defaults and formatting/translation handling improved for clearer filtering behavior.
  • Calendar behavior (rollback cleanup): Removed in-progress direct calendar-write functionality and related admin controls/status/test endpoints. The supported behavior remains unchanged: no Nextcloud Calendar app sync; optional .ics attachments are sent by email for configured absence workflows.

Fixed

  • Working time model modals: Corrected copy modal interaction flow, source-model presentation, and delete-confirmation localization/rendering issues.
  • Absence iCal hardening: Added stricter status/date guards, recipient deduplication, and privacy-safe event descriptions for substitute/manager recipients.

Documentation

  • User manuals and changelogs updated to reflect the final calendar model (email .ics optional, no direct Nextcloud Calendar app sync) and current manager/admin UX structure.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureHwGRZcCLjb/plcL+LoYgcSBNEXoLoZU2DlOb7pcOx6X41OU6v9SkdO5YXOynEBr7kmViQeQzJfLyTUTRSfcqLlz4jC8KL7Xmaa7rImQ0EGSVpaBmmUuHC0MWlrhWWMEkG52smtFFalq0GZy0wLhcHRc6BtqCzilQLju2jS5SR6GTPWutj0i9LsbKsB6LFzkbc9cAbtcRCUjzx9A2oU/EAA1BhRBlyQTvR/OLyDa2FU/CBNWrm3I9293E+D9UP9gMBhKvSH5f1DXF/TpwiCEzYB/NRR0KBXvQb30whbv6O/WJfCEs9z1+wryRvNfGjT0+9X4C3tPtLTpyh7noU7NK7VzS0Cl0/TbACvlEY8yk9I+UPbNYA9jUiNny2JpAh6syrFE3k2RrhIpiJ9iLwqKgUYN2rlx6LFtqWP1NlIExC97DdmCTt1YRTyeDzi/NrZuGKHl5JBtCJWZalX6KwxjJd4oBrxoy1+i/2BLSpjoUlvPQ2FHPlqdtHWcIqryrVzmV+8ZJyxmo5EVJR6bmGESQjUovJ70j5KIltEg1OM/5MAyJ9hkIBJxjXiLTvocREbYOdoicChFs9aQFbDX0VN3BD4q6FNSiV5UXRsbzo57lxa4n51hB3tjoQAJ+rBlmMyVez7u1zNj+5X6lrvn7b5/5UQg2oHpaR8Hz1iPPou7E/GA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.10
Release Details
UpdatedApril 7, 2026, 7:49 p.m.
Changelog

Added

  • Vacation rollover: VacationRolloverService, background job, occ arbeitszeitcheck:vacation-rollover, migration Version1013Date20260407120000 with at_vacation_rollover_log; unit tests.

Changed

  • Frontend l10n: Shared templates/common/main-ui-l10n.php and teams-l10n.php so translated strings are available early across pages; related template and JS updates.

Fixed

  • Manager dashboard — pending absences: API includes summary.typeLabel (server-localized absence type); UI prefers it so cards show translated labels (e.g. German Urlaub) instead of raw codes like vacation.

Documentation

  • docs/Developer-Documentation.en.md: pending-approvals API note for typeLabel; user manuals (EN/DE): manager pending approvals show localized absence types.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturekmFxrMFQus0US44BSrw/0eOzjGU8zutOf6Q4Dqcc/39RNDiCiQOKB55We29dsKBZ77Qkk8fbitvBMURDmfLM21hqyrDTfltj77MNdonON7hcINJKQZG2fGLz3Rrc+10mDQDAiDqVQGOLrpJBQVuA+TxdUEA1C9+z0zwvmHLdlBEgXCw7k/4FoU8aKCA/Jcp02Fjr98PG+1MW5SbOtTs8oQG2iMpRe7Ogo+YzqZtU11KZ4tOr8zEblZeh7oSG+AaIlj16YscKKCWAL3MLmyRvYTXWpPgsu4xLp+AUvTGbSEKUlDeEznDDkGpUvVrd2pTm4Y7xyc8X8c/0WQRqWuioiqRLUHHldJg8MjgL4s7mQkqy95dfZ/xQRC9BAc/cbTceynA8PD5XILnQAVgVRe9hXsji6TgN2EURulrVsBbCN1wCAp/Be9FqH7NYiQYxhmVfYM3kmyMdVe/+owslEAaMcmjT/QcZQlCeJj5SNOXCqVwCsks0ijINP2utN0XO4mlHkCt712QwFAMw86rSjnuX7eA1W6w2OpFjFFobOekDaUgBs8ID4LMgpOWJSGTI2P9AHtBJTMNSrRmsMzQmafZYdBm2F9gO4tz9ktxbhcmBFWpTvNHZimE6Re354pnTOQIQ4yCKU+8VsqYEJxdxe1JYXE2yTeNCKOCcIywL8/hvVS0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.6
Release Details
UpdatedMarch 27, 2026, 6:08 p.m.
Changelog

Added

  • Development tooling: occ arbeitszeitcheck:generate-test-data CLI for deterministic demo data (time entries, absences, optional violations, demo app team) to exercise UI, reports, and workflows locally.

Fixed

  • Reports UI: Report type cards are no longer incorrectly disabled when a team-related scope is selected (team scopes still use the team report API where applicable).
  • Reports (tests): Team report CSV download test now reads download bodies via DataDownloadResponse::render() (Nextcloud API).
  • Team reports: Deduplicate user IDs before permission checks and aggregation to avoid double-counting when users appear in multiple teams.
  • Absence type badges: Stronger, theme-safe contrast for vacation / sick / home office / other badges (readable on pale Nextcloud palettes).

Changed

  • Compatibility (dev): Local development stacks aligned with Nextcloud 33.x (example: official nextcloud Docker image).
  • Reports layout: Reverted an overly aggressive “full width” parameter form rule that could interfere with scrolling/layout on the reports page.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturehE0UvSaJEnunYMHOd5u3aR+5MyAg2Pl78l3t75Fx494nh6CzImBfoaswZXb9agJ6Iz1orktgFsKlTqfZoSGNxuZHRiRjcbtC+LsLLQsjONX5i5UOXK6crz87+6TEDAPkgdr318s+w9qHvTic2kdcdx+rpqbBSMIAgU/GuVZjyp4wtCV2Ti9VFR1pFzAlmH95b6WVCQCdTYmWs7LsLY//midoEYCd8JXSicLvr2nobqTL/soYZdR/39931AgpiUO5B9Rd0Wo7NVhk8C59bmlNqkLa8UDZHTZ/Eseks/njP9CdRsgdaUiqIm3libscOPzoFg2abyJpIZUV/nV8acOq8dh/XNNVRuLxxHs5v5FcByrnuxE4G1IbyC/FtB1KFRQlGF+rwwSEzBKdkNCdH5zbJ//gEgRfjZJb/Ijtma9+14jeRub/oLHQx0Mkh27aVMBPbqDI8LeuOLWo4Gbd4RXFknth02gSZpk1/Ko4uE90R44RcO2YUS58qvKQkickIoDEQId9w55FIEyP7LIAZa2bXl9qYZAA+CHCwixsBKi3a+yADg/wWaN4roVQ4LobTjp1adPOOVWbTHSemHRgEsqpboMxRXcrRWan8pNiQrnvTbJwIu9i3Q6zgHtHXe6RviFMzwiMJQTdvLhhHuANr9Lt04cCZjPS2dWfjGCZKVfo7hM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.5
Release Details
UpdatedMarch 26, 2026, 6:57 p.m.
Changelog

Fixed

  • Admin settings API URL handling: Prevented duplicate index.php/index.php path generation when a route URL is already pre-generated by Nextcloud.
  • Frontend error handling: Avoided unhandled Promise rejections in callback-based Utils.ajax() consumers after expected API failures.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signaturedkvj+LT0qxzHO59iXnzyYCXDEgfS9OMri9yD8QWcQqS/VPzNKFBHIHDqX/2JmnEuQFM6sKf+jyx0QORDIAC4h2XiZoUlJe+MHgZQGGqa/mA/SGFQtwzlxWw2A4Drm1ioGkOIwhGo5Ny0zIogawfyhPtDQX7Mjj2K9x5+OSHQKtQs8LGRiyy7EsVJUC4fWworktCvuqRYpvR+rY2GfSu0CcWWZVItcEYqAfDFl3UvmWag299QrF1g7SOVY1EcoDH2B+O2mOwXwj6JjWNhz4iUkdcbkthaHPwZ12cUTOYLOtopIILuRTdlXiYWqYvLn24yZUObqmS0LbNcyzAF8gF8LDOmp08FxRCo6NY4L9HJcvgaR4qDkOpiC1aj/9FK8LmRnmdOvH9FHIqr2P6eBP4uoetMWoMbW3QAqvizVMDYPe96Qj1m/Cwp2ogV5+D0JOt1Ms02LGHZ3pcBp0vojoUu52pdP+dXL1d0ZN4rzSPEVQboJllQz4dyahtQ55l2EuDdk6VVf35oOPFLt5HqIF84tFYbY4moxafMunMI2lSWeRj0jCxApnTcrjuWDRuG8Q/fv3Za2gtkSsx9XNLPAb6YNOrgKFEeZRtSIp7L2V6shwxn9H4PG2uETboUm44RWkoZO+JZFtNTTlZpij4B5mRvo/OamgruxwI6YgplBQXObSw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.4
Release Details
UpdatedMarch 26, 2026, 6:40 p.m.
Changelog

Fixed

  • Routing/compatibility: Added indexApi() compatibility aliases for legacy endpoints to prevent 500 errors in the Nextcloud log.
  • PHP fatal errors: Fixed constructor signature issues in AbsenceService and ComplianceService that could crash the app when loading services or saving settings.
  • Reports security hardening: Hardened report preview endpoints with start <= end validation and a maximum date-range limit to reduce DoS risk from untrusted parameters.
  • Admin “whole organization” scope: Correctly handle admin organization scope (userId="" = all enabled users) and enforce access checks so preview/download data stays consistent.
  • Reports rendering: Improved Preview rendering for absence and compliance reports to match the actual report data structure.

Changed

  • Reports UI semantics: Team scope is limited to the team overview/export semantics that the backend actually returns (prevents misleading previews/downloads).
  • Organization download guidance: Added explicit UI messaging for organization scope download limitations until organization-wide export endpoints are implemented.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureB+kiXQiNbiYsWVOlB3wiTffKZj021JMzAUzhQRYuwQmpszoGICQ7cCChEeggNXAMuOsRrPkznqB190jArt5Sfp7zKL5I3Z7IjyH6ur4aAqf6Tddq93/6Vb4W4ud9G30AJhkh3X0PBZ98bcOPcrxiaMrOqHryaIkcQ0os1pJnCAZ5v/zmUZGz/rVHxc0VNUGGvJZnx8Odwgd0r9z3McM4r9LL7n9+CrwtDMOVS/fUwAapkdaqM381pkLCa5BHM8VJd+ARz7Tt8rPVuVBwXDR9pkq38eoD9tQ61QVbCqrfsf4/8LgcbNlrHjWVRrAtUirX38JlJgFBKvmzaORvsgylNFggcrZ7sIx4o29kPPkFWZaUee0TKI/uc3WlThNIj/i4+sVTZ2Um23cfon/wr/sHByJIMOsFrw60s6RPm/XjAxeTnJbrm61ms9a0kKTodDR7puH0guqBQJX/CTJUQxcoPmKcfVqqblI2Ll/efOzi/BHYEEuiMGRVfYmuwtlALuFODD8ALFhf8EYmnB2EyCTLJwR+1bSUQF6/a/p4PP9cVSRKDbfYY3rpSU/QXbM3XTn3fET1dqE98FWEqPK6iNKdoMrcsZ4gkKNMNYKpAjMB9kbemHOVPNCIDVTIkYsVQO/edieH4N3EPouwzLWCvQVqWpb8h7SPbTslAhg45WtVByU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.3
Release Details
UpdatedMarch 19, 2026, 2:41 p.m.
Changelog

Fixed

  • ArbZG compliance: Corrected break check logic (9h/45min branch now reachable; check ≥9h before ≥6h)
  • Manager logic: employeeHasManager() now uses getManagerIdsForEmployee() instead of getColleagueIds()
  • Reporting: getTeamHoursSummary() respects period parameter (week/month)
  • Admin users: hasTimeEntriesToday is now per-user, not system-wide
  • UserSettingsMapper: Fixed falsy zero/empty-string handling in getIntegerSetting, getFloatSetting, getStringSetting
  • Routing: Moved exportUsers route above getUser to fix route shadowing
  • Version1009 migration: Replaced MySQL backtick SQL with portable QueryBuilder; use OCP\DB\Types
  • Duplicate notifier: Removed double registration from Application.php boot()
  • API security: Generic error messages instead of raw exception output (SubstituteController, GdprController)
  • PDF export: Returns HTTP 422 with clear message instead of silent CSV fallback
  • LIKE injection: WorkingTimeModelMapper::searchByName() uses escapeLikeParameter()
  • XSS: Modal titles escaped in components.js; compliance-violations.js innerHTML escaped
  • Admin-settings form: Added CSRF requesttoken
  • AbsenceService DI: Fixed constructor argument order (IDBConnection)
  • Admin holidays and settings: English source strings for l10n keys
  • UserDeletedListener: inject TeamMemberMapper and TeamManagerMapper
  • XSS: sanitise team names in admin-teams.js

Changed

  • CSS: Shadow-light variable, scoped resets, dark-mode color-mix fixes, semantic color variables, navigation height/z-index
  • Clock buttons: Double-submit guard (disabled during API calls)
  • initTimeline(): Max retry count (20) to prevent infinite loop
  • Accessibility: aria-label on header buttons, label for admin user search, aria-modal on welcome dialog, English l10n keys in navigation
  • Docs: Removed internal docs; added docs/README; corrected repo URLs
  • Manager dashboard: Injected l10n from PHP so JS translations work
  • Constants.php for magic numbers; user-facing error messages

Added

  • Version1010 migration: Compound indices on at_entries, at_violations, at_holidays, at_absences
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturePf3DfgKP/j8T95ElL4ORpuPFeD3UHt901udriCVI1yQdyRJDTp5Z8tHcaFpLRjjmjW8c1nFIEjrFVTjl5UNnPTTWzwf1+Woci/TtIHa7lDkMftxjIIVMf7khRJ6NGriUQD1WVS6Hqdi+FWafgnIqn7dO728K+lB3rFSlgoCoQgQpjjJ/D+N5yynIi44wiD7F8PngozN58wUdWoW02zBX3W+ndpEZXmrY2srqPndhBrlg4cOrE8cWSUFe9wtwSaopkDZPSl85Wsg7nwDOJGV1JaFzDdBxyHATs3kxJnsntXePI1j/O8bcWR69o45JkDY458TsiA0qweFMx5A3Ioh5K0Rrp4UQREthUP83sEzQCIo9ztzB3oeFr1sAs+/dfauAPLsHWNG3NO70fZ82RnsRKuhklTbL8RQ6gc2a3rqrOLSPypyLsv6+UxyoKwm41cggNl4UnhyUhoa33IjBiEoZDXTfB2d+fNZoTXkOYZdDTKcC9bNMc+mo8guNkTxqAYw8Ian0V7vmLs0uBJ9JYyyy5k8AUd+8ijMokWm/2VKPCbDga4mmZevp3KqSpVOqXYBJXmMzJH2Vf+LXZYjRHTScFQ92bXVz7VRRNoz+LEtZy4QYIT9u+YCIvu7ddT5RZmA08HIWU52W/jWQQiKraZE/Nw8Ks4VQBfB6TX+wDCGadBs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.2
Release Details
UpdatedMarch 11, 2026, 11:36 a.m.
Changelog

Changed

  • Long-term refactor: Replaced all \OC::$server usage with proper OCP APIs and constructor injection
  • CSPService: Injected ContentSecurityPolicyNonceManager via constructor
  • Controllers: Removed manual cspNonce (configureCSP handles it); injected IURLGenerator, IConfig where needed
  • PageController: Injected IURLGenerator, IConfig; passes urlGenerator to templates
  • HealthController: Injected IDBConnection for database check
  • ProjectCheckIntegrationService: Injected LoggerInterface instead of OC::$server->getLogger()
  • Templates: Replaced \OC::$server with \OCP\Server::get() (OCP public API)
  • Added GitHub Actions release workflow (.github/workflows/release.yml)
  • Updated PageControllerTest with full constructor mocks
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureVdOLtKkuJFOvqioRam3iZGmEiSQrA4Xc99thIdm97dMKFlfHskcRIG34rWiqftbbIh+6CgWWxu+YdQOLSV63qOtZ7rH/rl1x5hnhaR4GBDbTtnE/frmfTJYlpHlKVw9KSyniEEAE30lLl5tuYA/4myl+9N6abL+9oJpQo8nAY2oApVgdJQFHPvUPeaJ6q0Qb6GUkOTwZo/UgmT0cIqTL7Ymkvkp3OGE1nRr2hD+T5aFyXu0E3IfS5m+eete4Xdn5TcSYzWVB3oBdMxmRTUtracW4ar/ZstAIwsVxmrLcW4/2AgvUQrrAZ87EBNNoiekUF+nJogWpFeh1n6lN7ZbuUSQJaQtlquovukPbnOgO1AAFe3EMG2DmBtlbyn/jt8/DY5ql8VTDp62eKDJxYTodidjAQYkqMEve7XuTtPgrNwG9c4hFNYS5fIGz07ER4otxErRKC25d89ql/bkSDre0IZPw/gTgdEjx71iD/UZBf9b2tzhMKpNfdtlkT0BV1mNOa376kZzYOk9DcpAaOgobPK00gb3ZeeODGn29N8LEvEAI5SCoa1m7eT4B0KbMQNtgDEUNZrrvRf3Tzpb0mL2QUmf5i3sn10IjQ6KdTDor1xWFEYIF03M240Dw5ml/UUrDgvXI9WZ1BzgyNDe2HAVeNPb9akpPHUWYkoe+uOoaf7A=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.1
Release Details
UpdatedMarch 10, 2026, 10:18 p.m.
Changelog

Fixed

  • Resolved duplicate route names in absence API (absence#store, absence#show, absence#update, absence#delete)
  • Corrected settings class names in info.xml to use full OCA namespace
  • Added declare(strict_types=1) to routes.php

Changed

  • Removed non-existent screenshot references from info.xml until real screenshots are captured
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signaturec6nuFK9N2O61bf1GpNWz2G2FDt1GzTRzd2pXna6x5E/HI/m1e1dt8TheGnhfgYm/TY/o/W539hak3svOJbJmoJr/kmd7xVWRGnZH/PDBjROe5kwRIwWdZlR3z7DiOyTsZo44DBLvVFEaRMAjF4PpVpJxTIA0xV59d3YJHyFZXbMPxSvAbZu43bAjWU6kVGmfaKUOrW5d592aApbxQ+mwJS7LwFMXlxGSzyCTwYL3bMkwormPPS64RTJtrPhvImU09ACMsjwgERAuFGlvbGj8CiuXzAWoO7ISyxcsqiaw1jnA5OIlJ+hnQhUdYHtkIzdwNHxw4ItSBL3pSJjhwIyrs4zZRMkOVjTqDluDfmvbx3Ir9cglVHlMGGTOOJtuyU0PmL0Fo9HZ2R0Noz9w8T3cpetxRG+B+mSWapUblbM+BT6aIvfHMjSzvI0qjwzcczwVzkYJISHReObwYFpeVs5W7cW1gXY2mx42Q/fPqDkrM5wEiuYJ98QG7Y67uhYZce9wmAp0Pygx0UJILj4fNPLuA27hVOp3++x0rOxhEl1A4v0tgiX5pVRYK3qwf1vHFl3zSGgldQs2WUmJ6CoPWbIE6hzmtRUGMzSOnKEK+2eLHej/Edzdo75nVZd6maKXVAY1L+z74IK61HvJ6kQ0QXFO7urWBZJg+IfxzR6W4mrvZnY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32

Nextcloud 33

ArbeitszeitCheck 1.5.8
Release Details
UpdatedJuly 18, 2026, 11:18 a.m.
Changelog

Changed

  • Mobile / widget home payload: impliedDailyHours (contract daily target) is included alongside weekly hours so clients can show “Daily target” like the employee dashboard.

  • Session CSRF restored for browser cookie sessions on NoCSRFRequired APIs: mutating clock/absence/export endpoints that stay NoCSRFRequired for mobile Basic auth now re-require a valid request token whenever a Nextcloud session cookie is present. Mobile clients without session cookies are unchanged. Forged Authorization: Basic … headers can no longer bypass CSRF while the victim’s session cookie is sent.

Fixed

  • Absence cancel/delete/shorten race with approve: those mutations now take the same per-user absence lock and re-read status under the lock.
  • Status-path stale-pause repair / daily-max auto-complete: side effects run under the time-tracking user lock without nesting an outer DB transaction around a second lock acquisition.
  • Manual time entry create/update overlap races: overlap check + insert/update share the time-tracking user lock with clock mutations.
  • Month finalize/reopen TOCTOU: exclusive per-user/month lock around seal and reopen; calendar “today” / month-ended checks use organisation storage timezone.
  • Compliance cron / weekly average windows: use storage timezone instead of PHP default/new DateTime().
  • Absence business-day gates: “today” for cancel/shorten/substitute rules and vacation allocation reads use storage timezone.
  • Dashboard load-error callout: keeps aria-live="assertive" for screen readers; clock/break buttons guard double-submit client-side.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature1YxfevMESrUM//nCGciUukkJUENnGK1Zx28RQDbamoI4ObbLwsvsf3iXtY8HSWvdXU/CcaaIkhoTz1AgoDrrc9hEuKgB5n+wLwSasEnCOFuEB97+cRXwPFInFhWY8l6At1iKRcfa6CI/dQoGL39p5afqFF9LNwASQj3t72wAGMFUn582kRolB1QoKJH5YisXq3hOUfkRRxmCE1QYV+UPeTvxhLvFZgN62CZC53ZQl7q7xVvPUIszduNjkdzfa3h3phb52+cU0XS5jd1KBXzJPdP+JKAo07X5ctW9w1N1A854M0NViBcm7OsWz91eQTI0Rbbn8AeClAMMX+hD/x5SBLmP1hw5sveGM6aX9W68rAqy7A1215xvAwqRMHHe6Nccd6zLFUvh9Ll2SEA6E3UNbch3IgtlhgnBxhOjZMrVVUjci82Ue0zrIN6MFLI5yCWYQ9c9m9hSfDeqj0X3mjD17uTsba3l0YgnBV6WkoYcwphvDETTEd4QRPw4Yy3nm5cZ9JvWN+XG2wL7xuCw7O9/rQAIjXDlI4FuG577wSjEdTcgiHMeHsB1aA5HKdxMyRth60FhJqEveOxOJ3N9RUQUTpSgzVbJxablgHSt3r4QABIWQahY79VYUDLYXmd05v+PZWAOWUHS6waOIdM8NHRIfvVLq3qR3WVoSftNVN3I1VA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.7
Release Details
UpdatedJuly 18, 2026, 2:08 a.m.
Changelog

Added

  • Auto break setting exposed to clients: the dashboard widget data (and the mobile home dashboard payload built on it) now includes autoBreakCalculation, the personal "automatic ArbZG §4 break insertion" setting, so client apps can explain whether the server may insert breaks automatically.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature3lsfEckilfrV40shkUALmCLcnU3GVW0m3VI/iRg1JxxcpMSBtmCK+OFGPo1fKN3Zz2gTicFaavr/4pfdl8oD2HUCMsRJtzt2URItVhM2cEybhBr3G1p52hQWVoFGBb/1QOKflxFcbSAf7QLvA92Cje+qb8TUjyM5uNKLqEq/jr9y9nEH4afvS2LO8s47+akQn10KnlROcuIb3S6wx7yhNQUFsHnKYdUetzZJgTCxBFFrQ0llfDmFAJhnh1GFypqZ9MPhjbXqQBJ/lB9Unk/pekQqxaMREBY/K0gG7JEhmw6SPWcX5aGU3hmKvFLZB3lfWgt2EH4viQ5c6F/wqkM/fRZqZ4y/0kLHgr0KxMS/iJBTOISyGFxv31yEHQGbrUo6Rfr/8TXFYGuV2f63CyZIEe1s8WDdsGkakm+OnJTLUo1Rxu8s2LbECQJWYpIA/Xn546opsRPFtGFPWAPKJesHjmut1tKUrctx2zJxU30GFOkQ+U+nRrx2HRYGhJze+7OKxXCaW9imtsheFdb2AoPBmj12pN3ZHMWKjR4Um+v7LWKbOKjo7wzNTL85PsVPG8pF3TZa72jqqOZEZH34ayeUiv3n0lmt4aStaB3HYwb1yZOjH1oVZOhKmunDs4+naRLLweixcYyICLpCB6IPHSeByvzFUqxfmCAtaev1arL6FvQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.6
Release Details
UpdatedJuly 18, 2026, 1:33 a.m.
Changelog

Added

  • Mobile home dashboard endpoint: new GET /api/mobile/dashboard returns the full employee home payload (status, vacation entitlement/remaining, week hours, balance) for the proprietary employee mobile app, instead of the lean desklet summary.

Changed

  • Time-tracking status endpoint usable from the mobile app: GET status no longer requires a CSRF token, matching the other read-only mobile endpoints (still requires an authenticated session or app password).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturejIqTDpn3RCL8GdRV6/c46TD79xYOm5/UalYDOBjwkEukzMomLSYYlii5dfXyu+2FaGRqR782SaUf4Wl7TM+i54puPCDo0b97kZe68crptjpNCuNqhGcVg0DF/mYOjDIANClix84oRtzf41Utm38ctMxHCMQ53t2U314oTMRlruIJjpRXa2FJbKKuqa79jxOy6iz/26LBnIiIVF0RXB34qBMaFxy/YzzR4uHVs2uY5wDZUe/hlViFk+YQlwFWWulU+7HHQ2fBhky85qDvx6PyEKH0F6pk0k/6EuWFY++nC2zoYXtVl3biDN9st3lYPPgNWF63fUv+H/fmI6+TqbDTOCEolBMoKJIn3nK0Rs+kHqKoulkgkhYFxr2OzPNRW1Nf3YhRfUmp2QRdWw17pAeYdiivxAMtO1wtv0UXONTfdK0HjXPXkMRlQiTYTXuzyL/ZwsYhqk++4gLCdgsAjeYI+jQOid99iSkxcNkj/4xZPkaWqnoy2ScJZdakCAcsfnkzASOdcCoKIrsKvvam84nrg1wcKVNYpJL5H4W8t/LJmmiZw3GMdV07E7htCfY+6Ky8Gb71FNrlIQmD72HXtGeC11rbxR7D6lzTTRdo40n2YqglNEEmknElFubpYlUoOhqdwy0cCdHhuZbw98B8eFmF+RLfIsfjGWNVnSFrSg8lSuQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.5
Release Details
UpdatedJuly 17, 2026, 11:08 p.m.
Changelog

Changed

  • Vendor public key baked into the app: AZC2 license verification now uses the production Ed25519 vendor public key by default. Customer servers no longer need AZC_VENDOR_PUBLIC_KEY_B64 for real licenses from SbdLicenseOps to verify. The env var remains an optional override (tests / experiments only).
  • Clearer signature-mismatch warning: the admin license page no longer tells admins to configure AZC_VENDOR_PUBLIC_KEY_B64 as the primary fix.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturewFtcvk8BSgYUH7erpstedDBkV2MaKJZrLLW9Co8vzmPtwMccIiEaPN7rasvZJsq53IjE+mDSK+BzwrueIrN0XnCCvONC0R6ywYLYMBhMxZsZDiZrFYlFVMvcBq0I1h5aGBPsiYO8WYqTBN4DnX/xtsFORpTKJ+IVSDTw/tsTE40N+MIA+aCe0HJb3QZHXziYbxvPSAZIe6dI/v0+Lquii1anvf9k4oF+MfIo8a/7DB7jhY02BQ/8by8JG29AG86oL6wg7IShtR9sZlYD6aI+TBAJ7RZebFuqtta68WyRw8FL5rVy0O8DylWOCNFWundttwkUrL3WE8Mv07Rm+TpJbQ4uc0YdoSOfK2KNhx5VK4zO164z6twBJgusMDQzCoBSfsxtal6Zan8ORNvdh0hA/MI9lYnWX7gpJPdf5FGFoUgc7Oi9ASYC6j0TQE7vUr5kC8A2AoMnjahPykVc5x70NEIW8kboeeC0HjKxg7MNXSaCOJ49+7X7GnXate3cOTBem79vC59a2VvHjefomThLIF9ucnWS9zNXwgfxELPyIsCyKdTjM7Wbg8uD9fMhYZVgDlMLaa6Trj5jPayHMoKMHVY+4Rcd+iTWyGuTqsdyPPZbU/qBJCEhZej9uG1A7U0Pyrd9M+X+uoTxqQlBPFj1Y0blKosk7lPl0Buw2LyKK7s=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.4
Release Details
UpdatedJuly 17, 2026, 10:03 p.m.
Changelog

Changed

  • Kiosk admin UX overhaul: clearer three-step flow (find employee → allow access → assign badge/PIN), richer status labels, confirmations, and actionable error messages (including license/slot limits with a link to License administration).

Fixed

  • Kiosk admin APIs required CSRF again: removed NoCSRFRequired from admin JSON endpoints so state-changing kiosk actions are protected like other admin APIs.
  • Race conditions in kiosk pairing, enrollment, and PIN lockout: exclusive locks around terminal pairing, badge enrollment start/scan, and failed-PIN accounting so concurrent requests cannot double-consume license slots or skip lockout.
  • Badge enrollment only on active terminals: enrollment now requires a paired (active) terminal instead of accepting pending/revoked ones.
  • CSV credential import size limit: imports larger than 1 MB are rejected with a clear error instead of loading unbounded input.
  • Sensitive kiosk responses are not cached: pairing codes and one-time PINs are returned with Cache-Control: no-store.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureRYjKQgR7fhhltR+3iZrWtAevXZtgWOm72Sm9yskWQtXfDgcNiy4umdoCjPrr28t9NW+DASahC11vAFpT65cBVz3/uvuHLPlKtmUTDVb0MYX3FBdOnyYCERerVayRuVBosDJyRSylAsdOoHdvdwVZGzj3P7QTtRXgG3ZvKpg5vTUAvg4H20JknLPzrIRFUslZasnpEcgRpG2WCKLVESXcwdLFG0HTJzrZTwsxAYXd+jT5ciaJD1D3WiMZAjcNEzrPwIxk+KsRJLi1Ni1GVVmFvENUflrdXtUWCLTiixzEs6fsS2U1MrtnJ5ZZxGK9iVH48scHpKiJ4lGiXp48d6wnBuINz7JZ2HIrYQrrFCARNCMKW7j+5Gh4B8w+1UD1t1OtVkrrhgGGPOYToj/+dDHBDNedT+pbAQZx3h2GbjSIVY3cdCD4GRwcwxAjSu5sj0pqmXCPr5l1F8v6ClqmRvOAfFvnP+NC9uO+rZELc0MKPwZBy1ezIgCTiXgVgQk83jyI7Tf4UWSgP4biSpVFSVp/fZwNIetxiauxchKsGMHxuRtQbzCklKylhwf2h1pVuR/XfkxwsxEj3JHeUNXGfH9V85FGjW5P6oKeQaA1lvL9rn8/UhZqNC+LynlwFpUxPwbh5HZkkUsFLFGdPBz/uAmCFnFbErvejTYZZcy7xs0sEag=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.3
Release Details
UpdatedJuly 15, 2026, 10:38 a.m.
Changelog

Added

  • Instance-bound AZC2 licenses: license keys can now carry the Nextcloud instance ID and are rejected when applied on a different instance. The stored license state records the bound instance ID and a fingerprint of the applied key (migration 1033). The admin license page shows the instance ID to include when ordering a license.
  • Daily license maintenance job: a new background job re-applies license limits once a day, so expired licenses or reduced seat/terminal quotas take effect overnight instead of only on the next admin interaction.
  • Signature-verification warning in admin UI: if a stored license cannot be verified with the configured vendor public key, the admin page now shows a clear warning callout explaining the mismatch and how to fix it.

Changed

  • Mobile license gate covers the whole mobile API: previously only clock/break POST endpoints returned HTTP 402 without a valid mobile license; now all /api/* mobile requests are gated (bootstrap, kiosk, and admin endpoints excluded), with an explicit LICENSE_REQUIRED error code for clients.
  • Admin license page overhaul: redesigned layout with seat/terminal usage bars, assignment timestamps, and direct purchase/renewal contact actions.

Fixed

  • Kiosk terminal pairing could leak device slots: creating or activating a terminal now reserves the licensed device slot transactionally — if pairing fails midway, the reserved slot is revoked instead of staying occupied.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureXXtpAkga7MSWT0URLIx8lfJZkYdAp/OPaGbSyuv7lb7HoysNfKpK3Da+GcKbi0J1AdJUsSZJl5Q0Repec5Hc/V3cnykiuQn97n4JtNFKljd2oyjbs7YYvBuqGO6qA+wgATsrWijAI7uvVQwytYa5vwA6+lYkeuLgKZ0jbnnwL9YNvrHzzcu/8JWxMnZXHTQS06IvyIvVlPqYAunMgjnMLj6s9sxg7NOHWE8m2WKh2kHsHVHcVK7G2/zEGkXAt4vg9MOe9p3laDtnjue/eVtpc4ynogL/UX4O+X+ulnF7cJfJCR4FCu0meYwMuujgvJ42uS1DeBlICnV4+dIn4rYhxc8V54BMjlhTyeKCLFMAgs0myKVmfHvOElDCkB1Pu8RJcv8cAzG0FAGzOzwXIzapVAzrokquA4zOwQY7fgMYyFSZAuAxHEfQfkuLeZNPP/jhOPgm09N0NdFwGxOhwVEE1MVg0lFPOj+imT2M8kHKVuEyLV3wRFGbVG0Jjivo0NFEVFDI9x4ibnR3ixHTQhX/+XnRmkujPVF9JAHhRZlr+iuS/mWT4s0IkgdPjFprOi9YQH2zC42lqRpJCLx94EMqcTTFdM3y/rxFfDG/YNJgBr5MJSp6K0Krl/wjoBuNne5gzmjGV1PcaR0IpFgI74dXHU20pXtMvALHtD84HibTgMg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.2
Release Details
UpdatedJuly 11, 2026, 7:40 p.m.
Changelog

Added

  • Pre-migration backup before app updates: new BackupBeforeUpdate repair step runs automatically before schema migrations, plus occ arbeitszeitcheck:upgrade-backup for manual exports. Upgrade backups are catalogued with integrity checks and covered by unit/integration tests.

Fixed

  • Manager "Record time for an employee" failed with "Status is required" (#27): shipped in this build (documented for 1.5.1 but missing from the published tarball). Manager-recorded inserts now set status and audit justification before validation runs.
  • Data loss after disable during Nextcloud upgrade: UninstallRepairFlow now distinguishes disable from explicit removal — tables and settings are preserved on disable (including auto-disable during server upgrades); full cleanup runs only on app removal.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureJPP2H7l2IIixMFE7YJqvF+iaZB8L7+/0QAVjcbHaR+qQmRK/KO8lGTe6Jeiw+L4IMCATnqctysA7LzW/vHlSgVGgfmE4/kpi+zM7tGMvqKv+cmA0cTVJQhBRlw0G7g7keeDLScbID1eAIXXsjRJ1xhpyfUGSFYX53x+3dnHZ0GBdDKCfd1z+yp++QiTz1SQuAqjubLUvDTd/6ZugplY96nr8z6IkpsuzEjgcdkvySyFcoJNCJXWZGFkLlD2P0PEANvVR3dwW9Q2FLaqfgGTiJJ2vyL+BkFsCO8jqH/WOfWhw82HZJ4qprYQP2H5lGt1nCGDhojHhhFBOj5DOhlo435QYSWEdfoldqCj1Nsg2uqunul3xSg4cVX0E+K/IUmXCtIxjlIPthkJaVw0G/EPHBLsQzNeByeSuGGBeUQSbZRiXWEZRn3wglPAzGH0XCzMw3vfcNQrzAKns50WdqzDR2Y4mpPgb+6+IeEWWRz2gPQn4/0FGCVKBX2M41ElLgXGzAMiehCRISCJwQboMBhHf7oq4Jb/tHqEf7OYFz1gGaKBrUArZ4bvHF0cUNPq200s1vN7Cm8jJZaMCQtk5VlEDzuwuwrq3RNqlUaPoBLmISp6lW9UYpkpGjg2257meE+D9H6vd3+0uj/0jP/S1+V59E1+Q635m1D03KZqKYt/Z42w=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.1
Release Details
UpdatedJune 18, 2026, 1:10 p.m.
Changelog

Fixed

  • Update to 1.5.0 threw the whole instance into maintenance mode (#24): the 1.5.0 pro-rata feature added a 9th constructor dependency (VacationProrationService) to VacationAllocationService, but the published build's container factory in Application.php still passed only 8 arguments. During occ upgrade Nextcloud resolves repair steps through the container, which transitively builds VacationAllocationService, so the missing argument raised an ArgumentCountError and aborted the upgrade — leaving the server in maintenance mode until the app was disabled. The factory now passes all 9 dependencies.
  • PHPUnit segfault in full unit suite (~test 583): DashboardDeskletRenderServiceTest instantiated legacy \OCP\Template after hundreds of prior tests, triggering PHP segfault from polluted globals. Template rendering moved to DashboardDeskletWorkspaceRenderer; the unit test mocks it, and a dedicated integration test covers real template output.

Changed

  • Hardened the dependency-injection safety net so this class of upgrade crash cannot ship again. This was the second ArgumentCountError upgrade incident (after 1.4.2); the previous guard only validated the repair-step classes literally listed in info.xml, so a transitive dependency like VacationAllocationService slipped through. The release gate (scripts/check-repair-step-di.php) had an additional latent bug — a namespace path-resolution error meant its argument-count check silently never ran. The gate has been rewritten to:
  • correctly resolve every app class to its source file, and
  • validate the constructor arity of every service registered in Application.php (not just repair steps), using the PHP tokenizer so multi-line factories and promoted constructor properties are handled exactly.
  • Two new automated guards back it up: ServiceContainerDiRegistrationTest (static, reflection-based, every registered service) and ContainerServiceResolutionIntegrationTest, which resolves all registered services through the real Nextcloud container — the exact path that fails during an upgrade.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signatureu5YINc+PuS8hHrWz7yL/oEqD+JdCNSs2Gbuid0nMbFunQitWqgtsSNMPExv2ORm7Ll14LcjREkHyIRc0lv7px2fEXeIAI2rpvSf8NFAoamhuf4v4z/jY+LxxVyjkhhzWlX//Aar6TjUBLD0xk4MjOophqPY+f8ObHyW4SzSWMuElED0glM385ywWWwfVHbY5UWmzGwZ4qAAmshcE0tt2JZrlSAWXFUuTe/FdUKnUXoDVB9ahcBPitdxmF0UFHdX1+4OjSP8fu5m8KoMlM+qcZp9Nr9xxIiBZ9Ew4wnmhDq4cQqMzaBVMgW7gVv6KtehmP4W/3Hhyrtl5tUOB4cxTpnP1vNW0HMNgrNS2h8xsufOz0czSktu7YRstvcW95RWe9wZjH+pDwysBo05YfZPopBIu1eky+tF1jsvyBk9Z+aB6LnRTZ1qbtPZxK7Ce4QHsKzwTjtx7R/So/VUdSH64vkYI27ODmqn7rSjcmwCVbt4NDU7fog+47zmf6yiuML6GwUUQBdnMc5LpDUaKD+p2QdOzvQvU5ShCG0b63sTwHFBcG1KsTrIrQpG4BSF8wth7Uo58YmQHFX3G3Nk5XE02piwmkiySCTyLfTWd7bEu8AUrg71xJtVwrkXkgUmG+a632wfGZMvHHzv4A4r7pnXpIvKRhzmgGaB8Ap7GYxGXyf0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.0
Release Details
UpdatedJune 16, 2026, 11:37 a.m.
Changelog

Added

  • Pro-rata vacation for partial employment years (#23): employees who join or leave mid-year now have their annual vacation entitlement reduced to the part of the year actually worked, instead of always receiving the full year's days.
  • New optional employment start date (Eintrittsdatum) and employment end date (Austrittsdatum) per employee under Employees → Edit. Both empty means no proration (full entitlement, unchanged historic behaviour).
  • New global admin setting Pro-rata vacation → Proration method: Full months (Zwölftelung, German default) — 1/12 per calendar month touched by the employment, with a fraction of half a day or more rounded up (BUrlG §5); or Exact days — annual entitlement × covered days ÷ days in year.
  • The admin entitlement preview and the employee-facing "How is my vacation entitlement computed?" explainer both show the reduced figure with a clear note, so the displayed number always matches the usable balance.
  • Proration is recorded in the entitlement trace and historical snapshots for audit purposes.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature04r3eUzf162DBb4dMPJS7sQivJmQuO0es5mnUkPeRArAB+uCEbjQ3bx9btbltRYiJEug5fBGCVSr6kgEdSF+kmTmsk4hsAnISA4gUix6cFj0aIynbPRlYoq4e2W6IORRT6/U6DtM+YWGZxWKc6pe5/3oZEwk6RzRin3ZPcggwNY19vUaT1gHCxewODk73kf0x6FWLjFrHi0r0GZ+ukGlOt3xcPaGqjdxtcSN0QaeskEd8pFJS6QLVeXL2+IYrc46PrqvvV1Sk07ivqJJWeesmj428W2cdcnyKAgBOB6pjkJBCevoV4PoLfmorojPJl2Qpms0/0TiJGyqV+EaExfWRLPxLFwmdPd6hBdT4s36giR75jOdklf/G1alKrcttNnRLzpjYUxyrUElB9DHKZhdKWiJOAHaHvTe2j3OPPF0gFwxCaDhrlDL8Yc6lBmIxwX6Y+Rer9/e1uhnykn5Ww2jIYqeC+ASqsDiOUhYBLKab42v8xlhK60hMMiZNpo3fIwpQ0/LQ/986VlTSPdjsPhjam+W8ONtqMFnAqRqxonAhMxvkOX0p3Rw4CdL21eQJyzeX+XACQEVENRqk3vQD3xev5y1sEFlcXxk75ogpieOfefiiysRWTHR044qYBpmHmjAn1qwwHf5oqo3fpIMZgTbsMzF7ZCluS09QQPXpE3eZsE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.4.2
Release Details
UpdatedJune 12, 2026, 3:45 p.m.
Changelog

Fixed

  • Broken app upgrade (1.3.x → 1.4.x): EnsureArbeitszeitCheckSchema was registered in Application.php with only IDBConnection while the repair step also requires IConfig, causing ArgumentCountError during occ upgrade / web updater and leaving the app stuck on “needs upgrade” with missing navigation routes. All repair steps from info.xml are now explicitly registered in the container; RepairStepDiRegistrationTest and extended UpgradeRepairIntegrationTest guard against recurrence.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureICs/E2o/tBf8TpCMYgReOuPLGeKrhCplYvNCM5kbNkP2HiqQRJpD2qPTc+fu2RgHBDtAdaahVDQfB6VdgqrhRMvFQVzqPTmRdNxjP/TJT6YYGllKwikajxlZVAL/05Duo9AyxWzdsjtM6R4WfUK3WvfMY2Mc7fd1JTmiVpAuX92FujyNmyZSh2NF82R4wU+IZiwK4elYnfxn4At/ebMmLW3wOLh/tfPPSlPGBBjEfmG8XMLf2y3fK+wFG5P2Hfr+NXWSj5xpRmXOF7lVfOFpD3r6/CN+RLy1uN9JWzcnL9SPNCgCTLblCyLDKv475PsGOJl9wXGnP9eFLxpfAAKIY1aspOaaX14XXVWMN4xqyCpKuJbdmalS24vKr85Ln0i1hkad00jLvPcCTOlLRfdogfn0ISYBNd+t8ifSWKEIw0geROiHVpUbGjHlPfizDkqLUw+k5ha0UJfoy826uoE7ewgO11uWR5pQ7y9+nClCrclHi9y6ULf+NYYJlCykzqCMQru4UtbDmmHG8nlBYWQnOo8GqyYhroPkauDbPrdoP36wOrX/xjbnewtttQpYgAHRU8q7I9OJ4Mu8WH0YgUym/AjuKpDkR+74A5HEvwW53X1Bah5660eGr1ZKPjpDdL0sG7UMoNHLzU/Yd/7LSTqqj4Nk4xDa0cEEukq+mVXLvMI=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.4.1
Release Details
UpdatedJune 12, 2026, 2:57 p.m.
Changelog

Fixed

  • Data loss after Nextcloud upgrade: UninstallDropTables preserves tables and settings on disable (pass 1); full cleanup runs only on app removal (pass 2). Fixes auto-disable during server upgrades wiping data when the app is re-enabled.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureiQlJrDXH7/uhJKsNav1Z0nd0WyEEeiwHOpwkEyFOxMEmxO+H7/ivVzHztsP8NJ1REWySBC7mN+WM8LcQxbVYgCY6hBWff6Bbv3BJgQLAkuqUc6onwZ2tAzaiuR/S0HMEPnCQjAcDWc6Jt7zdt6FjWgXQa35VP9/Mpui149Am3qwy5uhqLJeTo5qlKwMELHiG5Xyz+/9kUVgrk2QhfmK56LonLcDRhXIwyoi55nmwizFKFSvJ9zjWVhc3MIl+dXAxg5ZbSLrLmvnoJsDIEJDlh752mlm4Fx8+gX294Kc6WBg/nUIMWggoKJCHZI3pJ45GRxewYJsZs3viwR3k5rxtLwyZu+McnO2wz8RTC5KZdw6svEUpAORNxbnbAuqlJOqbSppJjlGW8jIKopLWwg55vo2hsf3ZaAuhsWy5/afb/b9+TFvlzSJmptWScz4R5sIvdLWnisas7ayRWO4xXi89VrTukwGLzbjXJIhHGp+U61/5uLu4A3PradgnP+qtg2zps927MDjgdEjBYjWw7MXrVds42/rXBRtN2VPnj7ou9cuFJNkFf/GfBaWRU47AxaXlEWz8nUTEfBnQZb0ugRuSRkqtWYMpYVv8A56EyjJABdpLyUjRu7MwSQN1PRBCIiMZMK+9BLeK4sgTzS2FOLtue76A9jbqUafuiNnGAsdd+nI=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.3.24
Release Details
UpdatedJune 4, 2026, 12:41 p.m.
Changelog

Fixed

  • Dashboard widget: DashboardDeskletRenderService now uses \OCP\Template instead of the non-existent OCP\ITemplateManager, fixing Could not load lazy dashboard widget: EmployeeStatusWidget on the Nextcloud home dashboard.
  • Callout partial: alert-callout.php defaults $calloutHint to an empty string so includes without a hint no longer emit PHP notices on the main app pages.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureHbMR9UYH9j0V1gE6aOqBkwUMuN6o6kdufKydH4mwQE3Kkl4OsIunVe3qBvy0qHcQgKMU2VI87UawAcuL5FjsiHj8cqZfuFNSmlMVIb/ipKM1xxLZ5I9jBcadE/Xf4FJa4c8oQgfgQGAT9liys3fevhk/Vh04pyRC/A+rWv79OlT0TWyCZVSP05rbYDgve92qBlJIGWk9BRKlaTJ2C6mWD1zyuJjEi7DVrO03VN9MVVxHw7nhFJrFNitX6xrY9hWTtanmxDYNO7xtqtDPsElNxLWFZgUdRGhim3W0FdVQMii6mhOsKbj4hFwB7pk1IDjq9FRYHrgAllU24eAb7yVhMj9zRvBhuLIgYDReXWnHBZ9bjz+TT5np/Ru294OsSl7dp6Xoci7uN2HajMxJ9GzMRBxMqEfKfiXFLLD/yEk0Qx+1PLr985Y764Fssoa6I1bGrmTo04/+Qt1AC8LG5KkmeZfK4MA6awsOT45OKqkFQ6rihpobJvIReD4alazxjk/ova4+xBSJnu/+jO4yWyVlL56AleYdr1a7E4WGEAP9nzLWFX/BzFaQXY07vFjFgvHljXp0ByVsy8ceIjzZ76JyvkbrPC35P9qv3D8O4PrkyhP8lRik0KnJ5kajw5e/p9QqC9t0musDmpKLqpyh9UbPVhZJWE4bfp1RMenzh8mlktA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.23
Release Details
UpdatedJune 4, 2026, 9:10 a.m.
Changelog

Fixed

  • Install and upgrade path hardened. appinfo/info.xml now declares MySQL/PostgreSQL under <dependencies> (required by MigrationService for correct schema checks). EnsureArbeitszeitCheckSchema runs on install and before every post-migration repair chain so missing tables are recreated and failures surface in occ upgrade logs instead of a half-updated app with no UI feedback. Schema checks use the active table set only (legacy at_absence_calendar was dropped in migration 1012 and must not block upgrades). Repair steps use OC\DB\Connection for MigrationService, matching core occ upgrade.
  • Post-migration repair DI. ReleaseStuckPendingAbsences is registered in Application.php with AbsenceService (same as BackfillAbsenceDays + HolidayService) so occ upgrade never instantiates repair steps with wrong constructor arguments after partial deploys.
  • Admin schema banner. All admin pages show a critical callout when tables are missing, with pluralized guidance to run occ upgrade and deploy the full app bundle.
  • Onboarding API no longer fakes success when the database is incomplete — returns SCHEMA_NOT_READY (503) with a clear message instead of “will be saved after database migration”.
  • Health endpoint reports incomplete schema (missing table count) before the generic connection check.

Added

  • SchemaHealth, EnsureArbeitszeitCheckSchemaTest, and extended UpgradeRepairIntegrationTest for the production upgrade container path.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureqTDcyBckDVqDxwWcqy6hLGMqmhVWsDm5t5ByJta0x1UHMYhEgratJP60v/Qfpb7eExVk7ZbMArGlodQIgRQrWFFVbHPPwnaPscmBHMmoM5VqlXwtkKIbbgmfqxqV5lLkPA1nrEiBJOYUUgxG2tuMp9BHWdA3f2XsoQ2x/UKlSwu1+82ax6sHc8EvQWr+eUnmtKR7IjkTuaYJEHnaHgN3uN6XioPtJMiX1OL/bfkeiAT9sD5bK7bTaL83nCuzTejGFWYg2SSz4tElLPDe848g9xhlsgg1jwIFzz5HKrtVNq+EkhQru62HCjzejRGLN6l7+Z6hGhkHlXhGAckAnI7v1i85l9DJ092+2SLTMQ1vg5o1iW8x4JRn0/6RmePqQCV8WElog/FkTl4BlNA8CKjgzUo301AEjKqKtOt8b/uKlvQmx65vla3G9SEZ88MUbwH9jaNcTVKeubVokBAs278qDncfNR6Jkz1L4dK6v9haFNx37dSy4g6Hnavwr6znnDEK0P38j9fzuxjfqefzeeHPwe7jHQP/I0pwJvpsMML265HLTUPHlnxh5hHXXp86zv9fjY4TBk26AzyQ/uPvYD1GZ9XLruw31Ua8276G+qbmNsNY/2ntydR3Gi9PSWDBNAOGddHRrGUc8UPpbnlMdqWCtGDEAg/vlEpQ1dOvDqr/MJw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.21
Release Details
UpdatedJune 3, 2026, 10:12 p.m.
Changelog

Added

  • Organisation-wide time recording methods (#16): Administrators can disable clock in/out (stamping) and/or manual time entries for everyone under Admin → Global settings → Time recording methods. Per-employee restrictions remain under Admin → Employees → Edit → Time recording. Organisation rules are enforced on every API path (clock, manual entries, dashboard, mobile bootstrap, desklet). Missing clock-in reminders are suppressed when stamping is off. Audit log shows a dedicated label for organisation changes; integration and E2E tests cover org-vs-employee layering and API enforcement.

Fixed

  • Nextcloud Administration settings panel: organisation time capture checkboxes now load persisted values (previously always showed both methods enabled).
  • Employee time capture validation: disabling both methods is rejected before persistence (HTTP 400, not 500).
  • Admin settings status badge: uses shared WCAG-AA .azc-badge variants instead of low-contrast solid fills.

Unreleased

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturexwZuRuE7q6Pvz49TbD4EbtW+5pAzncGRYelTeZOhoBETF8Gytm0lR3DWP2Bl9edR5m6fpo8FNav8LM0lL1eg+2DlvSQ1RCKxuFANOAjTdgc/sAJVnSEHPKz7Mh5jl5T7wxz243YjN9CdzsekXTxKs8wSMqHkbQX3/SUzT5vvlwzGXJCh0Ir6zzgq5RGY1rSOL8tfvKFSvAWnKEFi53mE0xqjpyStT6399Q4e4pVmJbmvWDG7uzjb99JtVWrEhT8BWK8O9y6Ynho7sXNiim+rEi3D9ZrqoKSC/CSv+kyYr97j9V8/W0EhMAp6RYyD5zbuEykyPmKSKvEq0dfgu6tpTTbLFatHfKSqExkulaJd1p0CPmpzwB5gbU9o8/a+yuJkNxfGp1KJTbmmALLHuyiiv1kxwrDiCpHYf1FDOrAVofXIX2ADeuVtS8oQOCZ3rh02IuuEIa4IMEGRyWA3gQBdfhzhG0aBSNIo/RFd87wL3jvcE+NiuLVRAYBMlX2OwryoF831KKMnu1ja+l+tSx5yx5srhAO8LI/0zJo3c0AtdzlbDIpOwSEDa8CqepZuK7bk7S0O5fW+G4KilO4ZXZubGD5TKK3ZUkMD1kvtWEotPyxHp8aJd805RxyxYGl2YGGmKjnGOitob1O+V8bl/phnThtasczeE+saiOoqXVeeVd8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.20
Release Details
UpdatedJune 3, 2026, 9:31 p.m.
Changelog

Fixed

  • Callouts and notification icons (all Nextcloud themes): unified templates/common/alert-callout.php and css/common/notification-surfaces.css with theme-safe panel tints and semantic icon wells (same contrast model as the page header). Replaced invisible Lucide h.01 SVG marks in IconCatalog with visible accent dots; added IconCatalog::renderCalloutWell() and variant classes (azc-notif-icon-well--warning, etc.) so warning/danger/info glyphs stay identifiable on light, dark, high-contrast, and custom themes. Admin notifications save feedback uses matching callout styling and role="alert" on errors.

  • Admin → Teams: member/manager picker now finds people by name (#14): the people picker searched the directory by user id only (IUserManager::search()), so on instances where the user id is an email, employee number or UUID, typing a person's name returned nothing — most of the directory was effectively hidden. All admin/manager people search now matches user id OR display name (shared UserDirectorySearch helper) across Teams, the Employees list, the company-status dashboard, the manager month-PDF picker and the scoped-employee picker. The Teams picker additionally excludes already-assigned members/managers server-side (exclude[]) so a large unit can no longer fill the capped result page with people already on the team, and shows a clear "Showing the first N matches — keep typing to narrow it down" hint (announced to screen readers) when more matches exist.

  • Admin → Employees and time-entry tables: inflexible width / clipped actions (#12): table-heavy pages now use the wide shell (time-entries, absences, manager lists, compliance lists); .table-container scrolls horizontally only when columns need more space; action columns use min-width: max-content so Edit/History buttons stay fully visible on desktop; mobile keeps card reflow (azc-table--responsive + data-label). Manager scope pages no longer cap list width at 56rem. Playwright regression: tests/e2e/table-width-desktop.spec.js.
  • Admin → Holidays: auto-restore now respected when deleting statutory holidays (#17): deleting a statutory holiday while Auto-restore is disabled records a per-(state, date) suppression (at_holiday_suppress) so the day stays removed in both the admin list and the calendar after a reload; re-enabling auto-restore revives the day and clears the stale suppression. The admin list and the working-day calendar now read from the same DB-backed source, so they can no longer diverge.
  • Admin → Holidays: "Default federal state" select is now functional: the control on the Holidays page was rendered but never wired up — choosing a state did nothing. It now persists the organisation default state immediately (with disabled/aria-busy state, success/error feedback, and rollback on failure) via the existing admin settings API.
  • Admin → Holidays: statutory holidays are forced to full-day: saving a statutory holiday now always stores kind=full (the working-day engine already treats statutory days as full-day), so the table badge can no longer claim "half-day" for a day that is counted as full.
  • Admin → Holidays: honest delete feedback: removing a statutory holiday while auto-restore is enabled now states the day will be added back automatically, instead of a misleading "Holiday was removed" message.
  • Sachsen-Anhalt statutory holidays (#13): GermanStatutoryHolidayCatalog seeds Epiphany (6 Jan) and Reformation Day for ST while excluding Corpus Christi and All Saints; auto-restore prunes legacy generated rows that used nationwide rules. occ arbeitszeitcheck:holidays:verify now reads the DB without reconciling first and fails when extra statutory rows remain (not only when catalog dates are missing).
  • Admin → Employees: entitlement preview UX: human-readable summary line for HR; full calculationTrace JSON only inside a collapsible Technical details (audit) block (WCAG-friendly, no raw dump in the main form).
  • Unified date format for Stichtag: overtime tracking start date uses the same dd.mm.yyyy datepicker as assignment validity dates (admin edit dialog and Nextcloud “New account” panel); values are converted to ISO before save.

  • Admin → Employees: overtime Stichtag / opening balance not saved: UserOvertimeSettingsService passed the Nextcloud user id (string) as the audit log entityId (must be ?int), causing a TypeError on every Stichtag or Eröffnungssaldo write — with the atomic profile save this rolled back the whole transaction and surfaced as “Benutzer konnte nicht aktualisiert werden”. Audit entries now use null entity id (same pattern as time-capture settings).

  • Admin user pickers (Teams, month reopen, overtime audit, vacation simulator): replaced the old 50-user dropdown cap with a searchable combobox (GET /api/admin/users?picker=1), minimum 2-character search, enabled accounts only, and shared WCAG-friendly styling. Legacy GET /api/admin/vacation-layers/users delegates to the same picker API.
  • Admin → Employees list: browse all accounts with Previous / Next pagination (50 per page) and honest search feedback; empty search no longer hides employees beyond the first page.
  • Manager employee filters (time entries, absences, record-absence form): replaced large <select> lists with the shared searchable combobox scoped to the manager’s team (GET /api/manager/scoped-employees); admins search the directory, managers only see their team.
  • Admin company-status dashboard widget: status totals now scan up to 500 enabled accounts (was 200) and note when the directory is larger, with a link hint to Employees for the full list.
  • Admin → Employees: server validation errors from the atomic profile save are now mapped to the matching form fields (instead of only a generic toast), with focus moved to the first invalid control.

Changed

  • Admin → Employees: clearer “Find an employee” search with help text; pagination status shows ranges (1–50 of 150) or match counts when searching.
  • Admin → Employees (edit dialog load): vacation policy for future-dated work-schedule assignments is resolved as of the assignment start date, not only “today”, so opening and saving no longer mis-defaults to “inherit” and triggers a failed save.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturegeMFAGBU3RbCnVfsYVqpdfDm4WygcEkjnK5Jg1u6auf+NCYR/TDRWQVnuh+wVsyVpJHmw58G2oUPy/D+eTh+pEwzUVeut23+vPhW00jAoHHxXVkTSGXuAZlG9f1cRR0KDc4ClcsgiECSSvpauVs2Nuq2dlkrg39wf1WIRpuEXagIRoErKmz/AOJEJNWN3j2j4Vp69EMtlDZSgMovnGJ28H6wKDmjQFrmWO0e4g1UoAGSmxAcQE+agRKQjoefMiqws2AZh9uPrJSZQK4hW+L8X0sGp/yOtlmebo7PAzMC9KphJnKlsmf74d88G5tZfjwmGlb0Ptu0XicNNPizPQNBZo2ohQYIsSx4ZWWFRf4O9o4JDrHP6sOpOZWbmr/DJp9wQ5brkcYdiP2dzYaSvj623iYO2Vndyqn6OgMmCNjeFS0Ksz0aFwo93XukZtqtjGAH8yeuV+xee09dQy57lG+9rK4lR+gjkxE9G1u8z0mSWr16ysMdJVq1brmE896xqL+kaQ+jZ3eW5OiqfUDp97nzwAmq7DbTaSMO13hrTuPbI9aNwvCMsmIyz4U1L3bifavS0+VgJoRu1glxBdH+lL9K59q+t6aFF8a9UDbYDgvfnm4Kj6RnGSKKeHSycUw7slHb9U9cM8sgKcR3HE8EIuJMdm6KTri+edRup7EOJDU/M94=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.10
Release Details
UpdatedMay 30, 2026, 6:12 a.m.
Changelog

Fixed

  • Calendar day details panel (#11): side drawer sits below the Nextcloud header (close control no longer hidden under the profile menu); calendar and app navigation stay visible while the panel is open; switch days without closing; close via X, Escape, or click outside; live header offset via syncAzcOverlayMetrics(); Vitest coverage in js/calendar-day-panel.test.js.

Changed

  • Overlay tokens (--azc-overlay-top / --azc-overlay-height) shared for fixed panels and mobile nav; theme-safe dashboard callouts (WCAG 2.1 AA contrast on all Nextcloud themes).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturepKOZDEKgte4hRCu2ujFlEugriqikEtGVDOTn//KioVz1qzKO4EWSK4sAzG4fpacAYckdh+cAV7mPbCu/4e/NSD6SqSJ6R3q4N1iiW1952XV4pJsKIF7UrYysYrUtYj+qt9MjQL99ehcqNa4/Gd0qf9wLjO9n6/U5n5ySx+trjwJwxdsfKIuHxTlhzKYkXx6jqZPHG5i3uHH4RYBfCZ9iT35aPKrYJlrSmVVxlFlh6yelwOkDHk0aWJIPtQku/FUW5zLW67k72BAswov1DpOvfkM5QOJQPdKjwhZB+lElosw+SWqCyNffGJYuWUzQVxGAFTEqQgQ9wQx5QFf4PQsr5ExKYeMm4RbpJph2UTqcpGiVInjCFi2vFZs1En2XpHKC/DaSwNNohsJI2pDcwoeohO0GeJSQ8WAOAgsdwLzXGd4PriQZL2u8t+TqMxeQfDZIVymN6jwdIaJPGc1Jvvi8SOFsEagVG/YpvJ0FNR+tBr7cwt4GSaqD05jcldAb9CSkfR9ZlEzGY6wcT3b6Mez/wnzvjs4bytzhW25xtlzBVc6vkkQUQsrCeBPOKe+g29SXIxIXmrmBCWiuxnhydg6XddXQMTZbCVYmMOcgSn7VtR1gs/FAifzsSKh09E6TypRMM3a9XFXMln2N7Sm/QRsh+6SJwF/zq2f+JX6cyv3L7w0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.9
Release Details
UpdatedMay 25, 2026, 8 p.m.
Changelog

Added

  • Unified layout system: css/common/page-patterns.css with .azc-page-stack, .azc-shell--wide / --minimal, shared filter grid, empty/loading states; shellWidth on page shell (auto-wide for dashboards, admin tables, manager lists).
  • Shared filter panel partials (templates/common/azc-filter-panel.php) and admin app teams callouts when use_app_teams is off.
  • Dialog API: ArbeitszeitCheckComponents.openDialog(); modals use inert on nav/main instead of aria-hidden on #app-content (live regions stay available).
  • AzcApi.isApiSuccess() for consistent JSON success checks.
  • E2E: tests/e2e/layout-smoke.spec.js, tests/e2e/a11y-smoke.spec.js (@axe-core/playwright, WCAG 2.1 AA tags).

Changed

  • All routed pages wrapped in .azc-page-stack; legacy .section chrome reset inside the app shell; .btn aliases to .azc-btn styling under #app-content.azc-app.
  • Admin teams page uses full page shell (buildAdminShellParams); navigation exposes a single skip link to app nav (main content skip remains in page-start).
  • Personal settings (Nextcloud user settings) and SettingsController load assets via FrontEndAssetService::registerCore() only.
  • tests/WORKFLOW_ROLE_MATRIX.md: manager role requires app teams; /reports is manager/admin only.

Fixed

  • Admin users page: pagination label uses {shown} / {total} placeholders and TemplateL10n for JS export — fixes Internal Server Error from json_encode($l->t('Showing %d of %d employees')) without vsprintf arguments.
  • Employee absence request form: azc-card layout, visible page title, workflow callouts (auto-approve vs manager/substitute path), fieldsets for request details and substitute (fixes duplicate “Substitute” label), side-by-side dates, clearer optional/required labels, azc-btn actions.
  • Time entry create/edit form: page shell + assets via TimeEntryController; timezone and approval callouts; azc-card with fieldsets (date/time, breaks, note); aligned break matrix labels; dynamic breaks match PHP a11y; responsive fieldset layout (WCAG 2.1 AA).
  • Absence create/edit/view routes: AbsenceController now uses PageShellTrait + form assets (same gap as time-entry create had — broken nav/header without shell); errors render on the list page with a visible callout instead of a blank layout.
  • Time entry edit errors: denied or failed edits show the list layout with shell, assets, and an error callout (no half-rendered page).
  • Navigation flags: centralized in NavigationFlagsService + NavigationFlagsTrait (all page controllers including Manager, Substitute, Compliance) — removes duplicated getNavigationFlags() implementations; compliance pages use forComplianceUser() (substitution nav hidden).
  • Absences list filter: legacy .section filter replaced with azc-card / azc-filter-grid (matches time entries list UX).
  • API compliance gate: blockingIssuesForCompletedEntry() + pre-save check in apiStore / update / store — ArbZG §4 break rules always block invalid manual entries server-side (strict mode adds further checks without writing violations before persist).
  • Calendar absence indicators: month/week cells show readable chips (type label + approval status + tinted icon), not icon-only strokes; week view shows absences; day panel lists status; legend explains approved vs pending; forced-colors and theme-safe contrast.
  • Manager month-closure PDF page: refactored to azc-card step wizard (numbered steps, person rows with azc-btn downloads, standard-width shell); removed narrow floating column layout.
  • Manager absences & time entries: legacy .section / .btn layout replaced with azc-page-stack, azc-card filter/results blocks, shared azc-filter-grid, standard-width centered shell (like month-closures), and azc-empty-state / azc-btn patterns.
  • Manager dashboard: migrated from legacy .section blocks (broken by shell section reset) to azc-card sections, admin-style stat tiles, standard-width centered layout, and azc-btn export action.
  • Admin holidays: refactored to azc-card layout, shared azc-filter-grid toolbar, table-container / table--hover, scoped CSS under azc-app--admin-holidays, and azc-btn row actions (fixes broken .admin-holidays-page selectors).
  • Admin vacation layers: azc-page-stack + azc-card sections (intro, L0/L1/L2, simulator), table-container / table--hover, scoped layout under azc-app--admin-vacation-layers (removes duplicate page padding and standalone .layer-card chrome), azc-btn / azc-badge throughout.
  • Employee time entries (list): timezone callout, stats, month closure, filter panel, and entries table use azc-card / azc-callout / azc-filter-grid; toolbar buttons relocate to the page header; scoped layout under azc-app--time-entries (fixes double margins from legacy .section / .stats-grid).
  • Dashboard overtime balance: negative and positive balances use main text on tinted pills instead of raw --color-error / --color-success, so large values stay readable in all Nextcloud themes (WCAG contrast).
  • Unified data tables: page-patterns.css defines one table system under #app-content.azc-app (.table-container + .table.table--hover, action columns, empty/loading cells); all routed list templates and dynamic report/admin tables migrated off legacy table-responsive / bare grid-table; TableConventionTest guards the convention.
  • Manager absences & time entries: filters moved into the list card as a flat toolbar directly above the table (no nested box or azc-filter-panel accent); dedicated filter grid alignment (no subgrid glitches); “Record approved absence” sits below the list.
  • Audit pass (workflows / a11y / security): l10n for app-teams callouts (en/de); admin teams full shell; working time model delete fail-closed typed DELETE; calendar day panel inert + focus trap + Escape; admin settings azc-callout errors; manager dashboard error path includes team-mode URLs.
  • Breadcrumb trail: simplified shell markup (no separator <li> nodes) and scoped styles so the trail reads as one line — primary link, muted section, bold current page — with CSS / dividers and ellipsis on long titles.
  • Compliance dashboard cards: migrated status and violations blocks to azc-card header/body layout (title + help left, actions right, sized button icons); removed broken card-header--with-actions stacking.
  • Admin dashboard layout: fixed styles targeting wrong .admin-dashboard class (shell uses azc-app--admin-dashboard); removed extra .section padding; azc-callout warning banner; stat cards grid; issues block in azc-card.
  • Confirm dialog typed phrase (client): if the translated label still contains %s after t() (e.g. test stubs or missing substitution), the requested phrase (DELETE, REMOVE, …) is applied so destructive prompts never show a raw placeholder.
  • GDPR delete UX: when confirmDialog is unavailable, settings now surfaces an assertive error instead of failing silently; confirmation results use shared isConfirmAccepted / confirmDialogReason helpers.
  • Fail-closed destructive confirms: Utils.confirmDestructiveAction() blocks month finalization, month reopen, correction withdraw, and overtime payout (single/bulk) when the dialog API is missing or the user cancels — no silent proceed (audit-critical). All admin delete paths (holidays, teams, vacation layers, tariff retire) now use the same helper.
  • Month closure lock notice (W7): shared templates/common/month-closure-lock.php with lock icon; shown on time entries when the selected month is finalized.
  • Settings UX: sections use azc-card spacing and azc-btn controls for clearer visual hierarchy (WCAG-friendly grouping unchanged).
  • Substitution requests page: removed duplicate <h1> and orphan </div> (invalid HTML); styles now target .azc-app--substitution-requests so the shell layout applies; empty state uses azc-empty-state pattern.
  • Dashboard clock double-submit (W11): setLoadingState() sets aria-busy="true" on clock/break buttons while API calls are in flight (with disabled state and loading label).
  • Reports DATEV discoverability (W23): administrators see help text under file format pointing to Global settings → Exports and reporting (CSV/JSON remain on this page).
  • Admin notifications (W13): sticky save footer, beforeunload when the form has unsaved changes, and aria-busy on save while the request is in flight.
  • E2E vacation seed (ensure-e2e-vacation): UserVacationPolicyAssignment no longer pre-initialises vacation_mode, so INSERT always persists the column (fixes SQL 1364 on strict MariaDB).
  • Clock status API (ArbZG calendar-day): at_daily_maximum and session_hours_on_calendar_today are now always returned (including when clocked out) so clients can block clock-in without an active session; overnight E2E asserts the contract when daily max is reached.
  • E2E clock seed (ensure-e2e-clock): dev/CI-only OCC command for e2e_* users clears active sessions and backdates the last completed entry when ArbZG §5 rest would block Playwright clock-in; wired into run-e2e-docker.sh.

Added

  • Vitest: js/common/components.test.js (focus trap / aria-hidden / typed-confirm label) and isConfirmAccepted coverage in utils.test.js.

Fixed

  • Production-grade audit hardening pass (UX-parity follow-up):
  • Manager dashboard (js/manager-dashboard.js): fixed an unbalanced paren on the team-overtime “Payout eligible: %s h” line that prevented the file from parsing, hiding the entire team status panel.
  • Admin users (js/admin-users.js): the two opening-balance year validation messages were calling an undefined t() helper; they now use the page-local auMsg() so the German/English text is announced correctly via the messaging live region.
  • Icon catalog (js/common/catalog.js): removed a duplicate calendar-off entry that produced silent overrides on load.
  • Confirm dialog typed phrase (js/common/components.js): when callers passed a non-default typedConfirmPhrase (e.g. REMOVE), the label still said Type DELETE to confirm because the translation already substituted %s. The label is now resolved with the requested phrase so destructive prompts are honest.
  • Stylesheets: replaced the deprecated clip: rect(...) screen-reader pattern with clip-path: inset(50%) in css/app.css and css/manager-time-entries.css; reordered border-color before border-left-color on .inline-notice--warning/--info so the longhand override actually wins; replaced two empty /* */ block comments that tripped stylelint.
  • GDPR data deletion now persists the user-supplied reason: GdprController::delete() reads the reason parameter posted by the destructive confirm dialog (js/settings.js already sent it), trims/clamps it to 500 chars, and writes it into the gdpr_data_deletion_request audit log entry alongside the existing IP/user-agent stamp. Retention-period enforcement is unchanged.
  • Tariff rule sets now produce a complete audit trail: AdminController::createTariffRuleSet/updateTariffRuleSet/activateTariffRuleSet/retireTariffRuleSet/deleteTariffRuleSet each write a structured tariff_rule_set_* entry with old/new snapshots (code, version, jurisdiction, status, activation mode, validity window, module list). Previously these admin mutations went through unnoticed.
  • Admin authorization now returns JSON for API/AJAX callers: AppAdminMiddleware no longer serves an HTML 403 page when an unauthorized admin endpoint is hit via fetch/XHR or /api/... URLs. AJAX consumers now receive { ok: false, error: { code: 'admin_required' } } with HTTP 403, while browser page loads still get the standard core/403 template. Defensive guards keep the path safe under CLI/test runners. Covered by AppAdminMiddlewareTest (HTML, /api/ path, XMLHttpRequest header) and AppAdminAuthorizationIntegrationTest.
  • Single source of truth for front-end assets: removed the duplicate CSS/JS list from Application::boot() — every page entry point now goes through FrontEndAssetService::register{Core,Page}(), including app-vanilla.css which is now imported by css/app.css. This eliminates load-order surprises and silent drift between the bootstrap loader and the central asset bundle.

  • Night / overnight shifts (Wachdienst): ArbZG §3 daily maximum and automatic clock-out now use a single DailyWorkingHoursCalculator (calendar-day clipping at midnight). All enforcement paths aligned: live sessions, clock-in, compliance checks, manual entries, automatic breaks, break reminders. Fixes false auto clock-out shortly after midnight. Frontend auto clock-out only when at_daily_maximum is true (never client extrapolation alone). User stats and manager week/month totals now use getWorkingHoursForPeriod() (same calculator). Compliance “excessive working hours” violations now use findAllCalendarDaysExceedingMaximum() (no false positives on legal 22:00–08:00 rows). Audit reference: docs/DAILY-HOURS-AUDIT.md. E2E: tests/e2e/overnight-daily-maximum.spec.js.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature2C4hs5Nkh/isdBTEdvZY3ot9kpByYyhztPuFF1szdNDnGW2VL4wnIo2CTjNogi5kdF8hsOuunKu+l2j9gqbb3Rg0dIUKN0pg+LGN/0k0PmHqPko7R6Qbau/bfqFPBZXBx9g/nVQ1IG+3Nm71r/V8LBBFA2cHD3SpRz4A+98ah+3Y3K62zKc+oa0SnqWQUB/97WR4rGNf8oatUerQl4iPg68AdIavnH5tZerU3up1gVNbwjyMSomopWbJvyBsSemhauUGAEx6tw4dbM8KZ1QkVHWzm/RD0s4gM8B+OE2ZOuThKkVc36TNbFNwwPJc/hzbS7P3RHfjaecHUODJiPAFhGFquhb/pvMmzReC6HoTrQLYg82VDOZmcvCjsMWvKPPu345ouqeif8MtJe0lJlTLXxvPxOFMbqLIthiZ1bbxUdiceLQ08JabJ0fxxCObBPilimywPUetparMm2am6+3Rrkbyme+Z5XhuDiscczNIAoO23aoFMY2UsJBH1GpuNgTKB5MG/r9ygKHn2Hsec0m/ziwqEuYvFcGzoZsUYH5uZeeVh5RzulicF36k88Tb/i8zIlrYyjU+w6xixr4Vg12lFQW6jIyPrdmnF1wNFTjaZOU9SBjR5EjrgNoow6ld5ncVdopMLH5Jrrmm9ts3oSV4IEbcEztxrjcMV9aTCbbwGrk=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.8
Release Details
UpdatedMay 20, 2026, 2:54 p.m.
Changelog

Fixed

  • New account + overtime tracking start date: the start date is captured reliably when clicking Create (no longer bound to the wrong dialog); the OCS hook runs only for POST …/cloud/users without sub-paths (LoadUsersSettingsArbeitszeitListener).
  • Manager correction: data-entry-summary is emitted like PHP with JSON hex-encoding; display times (displayStartTime / displayBreaks); empty clock values show -- instead of misleading 00:00.
  • Overtime: a future tracking start date no longer produces a fictitious negative balance in the current period.
  • Opening balance year: server validates exactly four digits (2000–2100); client validates before save (OpeningBalanceYearValidator).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureZ0q4sUnNdtEyv8lxCK1Rm/0xEeKazqwJeSURzbpe1ZgbL09P25KESZpPKZH0ynjwPzFPIkQO8wLTSZSXRs/9/M5I2jnuSZkzBBEZI/Lzfy1O9MK75v0aK+v8kItGR+o+pkb6zXEyxTeVhOsvXqDBeBG4oY32ODpRiOONCrJ3AXU0a+ZSnSCGWF1aU6oBwXl84Go+sq+t+ftXxzCjpmpBLfHqP/3in8oVTM/OkTJv+noOYUKeNDz33sQes1Iw+aufs+vOUdEQqLV2jI8Kxcl5E7uwCMO3ChguaIdqeiDN692nF7lF9Kr5BVS9HmueOXwVQPGxOINSTcYNtSPrCcXbHfuWgUBZxSXejwsQOix0FsIIWgu/6j7ajNeZ7bQpt6hOtpC/Bdkk6SOELcG/0wumofrGUYUSRGFYzxV986X+npvdukna/1rIp5+wuN6mft+g37N31iEdfH6lf1B0VLkVSoX3nhkNq/O5suuRRMnN4GgRmduGU44FtrRSVv7wlOJevgwEOuWbkEryrbnkHL821YhIsop/8+WX5H9ZBDu3IcSLc2FFv9fAfpIa3UnKTXvjAvC2Qiuo1kb8t1q5q69tYTYX9HsS4Zd9/JvKn6ICtwvfFuFpDLCyTWC0pczjkV2NWQaxkp2RC9X5Qsl5U6CZUQqnB59cGOxOyV6d2Q79hOg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.7
Release Details
UpdatedMay 20, 2026, 7:44 a.m.
Changelog

Fixed

  • App enable / migration on Oracle-compatible Nextcloud installs where physical table names must stay within the 30-character limit (dbtableprefix + logical name). The overtime opening-balance table is now at_user_ot_year_bal (migration 1025), and migration 1026 renames the legacy at_user_overtime_year_balance table in place on instances that already created it, including PostgreSQL sequence cleanup. No data is copied or dropped except dropping an empty stray target table left by a failed prior attempt (same safety model as ProjectCheck table renames).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureB7PdTU3mqJ/98cpYZ0TnDGDCx+oZCtqWFxHCQic9SB4UoVrwJa59UptjIY/ZxA5T9SiPtcSl2E6sAnoGQWzdbM3wLfnmUu3TA36AjK5xtrBOV3z8VNJeNdVHhay0EYnFXFZpTx2JzYMQH8zW0JgZey7olRodmWcqj9jcjgaqyWeERYkBYiAtgPaMrfR0++JHqTCCT+xHJZc+H8FPL8SeKUEwsNq+hnpCD8UH30XTdvDhLQ+ZV1GXdsfpd5/RsLtR3tTk9TTCIsT7SlU97g8js2DwWHOO9w7bCDWlh+gMm33IcNqrEZQtAn+nT3uWK8haxVCPlaB5kyJJm+kMP9OfvoN1H0dEiioN4muHr5pHgTGR+KaGjPKeJ47epzRD6cvRSsjwrcQVlKlQcCTXWdBf2N4ERAqnr23/jAxuto6xYTToRq1evOLLgMhkq/4zFP/uB8h5dnqKXiOg3HwNQBW2EmnLWxiTG9uSkfCbKsupQ+YPGOwK8Xj/mtU/HmsWecl8izqjcTHSkTm0tO7ehN+8ME2LSzTUrnIYyLcpkaJqkOouFFAEBG/ZNXonDjiu33oVWjOrsJdWq5Wr7vYlI1B8TxKI+ovgfdgLqn72Hb50xYgnVfSjX93zW3cwXEX82yeu+KL90OcGtJCSMsLlQd6hq48Q2KXHMdHml78r7bgWmO0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.6
Release Details
UpdatedMay 19, 2026, 4:17 p.m.
Changelog

Added

  • Manager employee time entries & absences — accessible filter bar (templates/manager-time-entries.php, manager-absences.php, css/manager-time-entries.css, js/manager-time-entries.js, js/manager-absences.js): two-row CSS grid with aligned labels/controls, WCAG 2.1 AA patterns (fieldset, aria-live errors, visually hidden sublabels), client-side date validation, and a 365-day maximum range enforced in the browser and on list APIs (ManagerController).
  • Manager direct correction dialog on employee time entries (js/manager-correction-dialog.js, js/common/time-entry-clock-form.js, lib/Support/TimeEntryClockPayloadBuilder.php, shared correction l10n partial): European date + clock matrix, optional breaks, server-side payload builder with unit tests.
  • TemplateL10n + templates/common/manager-employee-list-l10n.php: safe server-side JS translations (single json_encode of plain strings) — fixes Internal Server Error from json_encode($l->t('…%d…')) without vsprintf arguments on manager list pages.

Fixed

  • Employee time entries page crash (ValueError in L10NString / vsprintf) when loading manager list l10n; %d strings are now translated with explicit parameters before JSON output.
  • Compliance violations filter/export UX and admin dashboard overtime onboarding tweaks included in this release train.

Changed

  • User manual (docs/User-Manual.en.md, docs/User-Manual.de.md) updated for manager list filters and correction workflow.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature0Ac+p2TednXZOZygWTS03vqEgTpCHvYmjHTVXsUhKOnCwFQQS6qZS5ss2QJ1tfJHH/17mGB+b54zhzIC69ZSn1ka8V97iYTAyoY0I9iQCla2zAlV5JlieuIJ2vjDbzJxetzUvrFsdPibiR6Ug5lq5roWpWMLASNeJ5PKFkKGXQmmRRt2xVYg3XbTB6ScDFGtAjLgIi9/zLGICX/CQl3wi0GEXewNpHnZaN5yVNL6R3h3Ez1wYUhXosUUQRtPKfEGD/ot+lwQGluoFT9B/cKPPjexl0h6vNrNEdXt6JkSi0fjFwyr/VO+emMtdT9ofsnP3EronfWHeciqk5bRXjOoZ1mNEXcwnO5FzYayJ9IPAyl+NWJ39I22R31aYYE+z67QK3TkunuLKFZ+/wzPFeNFQxTO2PlID+UEYl73hm6Xoc5qyGBAAMqKKTlF6sv7bKJA7DZnxnMtkXx065wpNJhb7IjgfXkaYFHfzaPT+fTAUEWnAobERx+2e+gzH0EIONKtacZkSX/+V2fgyKCzsw8iW6VwXVpK/0q0jY0WrM4koSenTCqb3Ppt/u4/YIeKyZQKE2di03fEMukpGER4kJAbaVINSkmhiFvSSaBkHOjn3Kdnaxq+4Wjw9Aiyw7CA0Yo1owrM/URzpfkH+928j1eDIgM1ZHMyd8PF7+R3MQoCjis=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.3
Release Details
UpdatedMay 18, 2026, 8:04 p.m.
Changelog

Fixed

  • completePausedEntry() preserves an existing end_time on legacy paused rows that already carry a frozen end timestamp (status/end_time mismatch). Without this guard the service could overwrite payroll-relevant hours with updated_at.
  • RepairOrphanedPausedEntries now sets ended_reason and policy_applied when it only flips pausedcompleted for rows that already have end_time, keeping upgrade-time repairs audit-consistent with steps 2–3.

Tests

  • New: testCompletePausedEntryPreservesExistingEndTime.
  • All 568 unit tests pass.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature0pwv2HKTd56i96aLU9V8qR6lOzimwWXhqhWSc7Qg66mq6YUrCmPIbXYISOwPTJfjpw5M4FhZycmTA2lgG3EAA98ZSBJFnAF1jP7448eX2A5fcEuTpTjFHq0tbvnMjTGAsnV7WNRBnstL/z7SRJSxatvVA/LDs2WLaCxNzVGw/DT25ls7JR17YiNBhzNDVksC6u1AHmZeqx6Jlpo4H4Oi3JQ1cQ4kigPSVi9Hae5kUmZ0jDG77OACeg9ZbtwWpxQllxALQE+WjKUmniFpLFrVea3ngGelh3ef/MP5SexBsuijZF8rIbeTxgg4qdYI+6nwQ9t2rHM5kMAtPgIiWjdsD39cNlPM/y+dQJDHzxddyVpXuWw+pSlLBxMadjPS17X83FksWfvtNATwe64641Ba5F4vTJEQdBclnTXCgwA02ioR59YVQ3c/N8HymdZD3Zy6CGOzGyYvEtlF15YsXCh2PB8Xxa0VeBQSnKASq/LIPhguuuea2S7b3vNkGbOjRvrGhkdlZFT/bVkmh7AYkZ5tZbSACA1lw6WteOtNK5+LP64KLw6B+lZB2Xhn3ZRl3QnYrG6B5FerUryhEnKDK6Or1Z/rlcNhS5uvTCxDeK58PasFbCeiUa4SVg5tZgrUTDy6FjiQ53T4DVGImGcI7vy528e5DHpGSaafPJksvP6LicQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.2
Release Details
UpdatedMay 18, 2026, 5:57 p.m.
Changelog

Added

  • One-click recovery for "paused" time entries (issue: time-tracking/paused-entry-recovery, addresses upstream reports of "pausierte Einträge nicht bearbeitbar/abschließbar" and "HTTP 500 beim Ausstempeln, keine UI-Methode zum Heilen"). A new dedicated endpoint POST /api/time-entries/{id}/complete finalises an entry stuck in paused in a single, race-safe step. The end time defaults to updated_at (the moment the broken clock-out froze the row) and falls back to start_time as a zero-duration safety net; ArbZG §4 (automatic break) and ArbZG §3 (daily maximum) are applied so the resulting completed row is compliance-equivalent to a normal clock-out. Every recovery is audit-logged with time_entry_paused_completed, ownership is enforced, and the per-user mutation lock is honoured.
  • "Complete session" affordance on the dashboard and time-entries list. When a session is in paused, the dashboard status card now shows a clearly-labelled "Complete session" button next to "Resume after break", and the time-entries list shows a primary "Complete" button per affected row plus a role="status" banner explaining the state in plain language. WCAG 2.1 AA: minimum 44×44 touch target, ARIA labels/titles, never colour-only signalling.
  • TimeTrackingService::completePausedEntry() as the canonical programmatic recovery path. The controller is now a thin shell that parses input, delegates to the service, and maps domain exceptions (BusinessRuleException → 400/403, MonthFinalizedException → 409, LockedException → 423, DoesNotExistException → 404) — never a generic HTTP 500 for a known business state.
  • TimeEntryMapper::findAllPausedByUser() + post-migration repair step RepairOrphanedPausedEntries that idempotently closes any leftover paused row on every occ upgrade: rows with an end_time are flipped to completed, rows without one are closed at updated_at (or start_time as a fallback).
  • Layered vacation entitlement — degraded-state trace flags & impact preview (issue: hr/vacation-entitlement-hierarchy follow-up). The resolution trace now carries explicit degraded_org_default_collision (REQ-ENT-10), partial_history (REQ-ENT-13 / EC-11), clamped + raw_* values (EC-08), rule_set_status_warning (EC-05), and degraded='model_lookup_failed' (EC-04) markers so auditors can see misconfigurations and best-effort historical resolutions instead of silent fallback. The admin simulator surfaces these flags as labelled chips alongside the result; the employee explainer surfaces a redacted subset (degraded, clamped, partial_history) without leaking any internal IDs (REQ-SEC-05).
  • Impact preview endpoint GET /api/admin/vacation-layers/impact?scope={org,model,team}&targetId={int} (REQ-UX-03). The vacation-layer dialog now shows "Up to N employees may be re-resolved by this change" inline before the admin clicks Save, with WCAG-compliant colour states that are never colour-only (icon + status text + ARIA live region).

Changed

  • TimeTrackingController::buildSafeErrorResponse() now catches OCP\Lock\LockedException explicitly and returns HTTP 423 with a translatable "Another change to your time tracking is in progress" message, eliminating the opaque HTTP 500 reported on parallel clock-out / break-start.
  • Paused / break / rejected status badges in the time-entries list now use semantic warning / error styling with descriptive title attributes so the state is conveyed via icon, colour, and text (WCAG 1.4.1).
  • LayeredVacationConflictException for lock contention (REQ-SEC-04 / EC-07). LayeredVacationDefaultsService now wraps Nextcloud's OCP\Lock\LockedException so the AdminController returns HTTP 409 with a translatable "another administrator is editing this layer" hint instead of a generic 500. The admin JS surfaces the message in the dialog feedback area rather than dismissing the form.

Fixed

  • Navigation icons script — remove duplicate navigation-icons.js IIFE that registered a second DOMContentLoaded handler; expose window.ArbeitszeitCheckNavigationIcons.apply for dynamic [data-lucide] placeholders after page load (CSP-safe local SVGs).

Tests

  • New: 5 cases in TimeTrackingServiceTest covering the paused-entry recovery path.
  • New: LayeredVacationEntitlementEngineTest, LayeredVacationDefaultsServiceTest, and AdminControllerTest cases for degraded-state flags, impact preview, and 409 lock mapping.
  • All 567 unit tests pass.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturerFfQ5Jz3WAqqDDfkSEHAKs0JHmFWSpAAH9qaRFyTjE7CLFTbm5X2pvNh71mEop6b3wvS6upZ3N3RqOPn9R2SB+yGXR5JRkVRX0GGJkIt7cdmQcRDmdLuf+NIWYLguBJsMG9PRLxq7ydIvg07mRMLbbGMeG8baD6rILAN56wApr+QfU6qD2H0p6axB6N7O14ndLARJcUOA2E8QZf+vpFXohC3aXDkIENOjWJDK+MmG48NkGuo6/iTLekWHk+0KRyQrCYmQ5JwVG7MVsFhEh2bhUd+hchqcBJQSUWJufl36z2Mtk4N5/dsIOpjkVzKWLm3yZlaSyefTaZA+is4Qj8d6izsACq6zCt0IrU32EH41Yz9LqPKH2l2QTYgiy70RrFuVA5UO8SmuuGlP1vyzduQ7So28hksbT8N4wsTLEEk09BSCYkqhz4HFAfyvBVE4bTEl/cQe76gnQDnB3eOAyKQX2xDW1Xl9tv4MYQGPijJVL8dVt4FheTPfBb3RVe+Hjr5JZNd8Tx+6Nc2Ku1MYOElgQoF/2dWiXGQW12/WjJnMDH08GTmzUmjkAkOUQyFngwOiSuE04scny5ND3eAtxGwX7Tg582mcpjaEXTgdQMaGtulFv1UZVtR7Iq7B8b5FjUw75kx6dTIcthN+ssihaSaB5iYQw800bPsrojyNKwH9zc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.8
Release Details
UpdatedMay 4, 2026, 2:38 p.m.
Changelog

Security

  • CSRF protection on all state-changing endpoints: Removed #[NoCSRFRequired] from POST/PUT/DELETE methods in AbsenceController, TimeEntryController, TimeTrackingController, ComplianceController, SubstituteController, SettingsController, MonthClosureController, GdprController, and AdminController. The frontend already submits requesttoken consistently via ArbeitszeitCheckUtils.ajax, so all mutating routes now reject cross-site requests by default. GET-only endpoints intentionally remain #[NoCSRFRequired] (CSRF is irrelevant for read-only GETs in Nextcloud's framework).
  • No raw exception leakage in JSON responses: Hardened AbsenceController::getSafeErrorMessage so that exception messages are only forwarded when they are explicit business-rule \Exception instances; messages containing technical fingerprints (SQL fragments, file paths, stack traces, oversized payloads) are replaced with a generic localized error. Applied the hardened helper to AbsenceController::store/update. Replaced direct getMessage() leakage in AdminController::getTeams, SettingsController::index_api, and PageController page-render error paths with sanitized localized messages.
  • Correct HTTP status for authentication errors: SettingsController::update now returns HTTP 401 Unauthorized (was HTTP 400 Bad Request) when the request is unauthenticated, matching what API clients and load balancers expect.

Changed

  • Organization-scope monthly report downloads: reports.js now forwards user IDs resolved during preview to the report.team endpoint and falls back to a clear "no organization members had time entries in the selected period" message instead of the misleading "preview first" hint when an organization-wide preview yields zero results.
  • Sanitized dashboard load errors: dashboard.js/dashboard.css now surface a localized "Some dashboard data could not be loaded." live-region message instead of raw widget exceptions.
  • Resume-after-break clarity: Clock-in copy and l10n unified around "Resume after break" instead of the legacy clock_in_resume placeholder.

Accessibility (WCAG 2.1 AA)

  • Main landmark on every page: 17 page templates now expose a single, properly labelled <main id="app-content" role="main" aria-label="..."> landmark for assistive technologies (dashboard, index, timeline, calendar, settings, personal-settings, reports, compliance-dashboard, compliance-reports, compliance-violations, working-time-models, admin-dashboard, admin-teams, admin-users, admin-holidays, manager-dashboard, manager-time-entries, manager-absences, manager-month-closures).
  • Skip link / <main> consistency: time-entries, absences, admin-settings, admin-notifications, substitution-requests, and audit-log previously had id="app-content" on a plain <div> while role="main" lived on a child wrapper, so the "Skip to main content" target landed on a non-landmark. All six now use <main id="app-content" role="main"> directly. Removed redundant role="banner" from the <header> inside audit-log's main region.
  • Accessible names on all data tables: Added aria-label/aria-labelledby and screen-reader captions to the holiday list table and to the two notification-matrix tables that previously had no accessible name.
  • Live error announcement on dashboard: Dashboard error section now lives inside an aria-live region so partial widget failures are announced without disrupting focus.
  • Manager dashboard team metrics now announced: Stat numbers (Team Members / Active Today / Hours Today / Pending Absences) had aria-hidden="true" on the value spans, which silenced every metric for screen reader users. Each card now exposes a single, fully readable accessible name (e.g. "5 team members active today") via a role="group" wrapper while keeping the visual layout intact.
  • Alert vs live-region conflicts resolved: Removed conflicting aria-live="polite" from role="alert" containers in absences.php (form error), admin-settings.php (global error banner), and three time-entry inline form errors. role="alert" already implies assertive announcements, so the previous polite override could delay critical validation feedback for assistive technology.
  • Page heading hierarchy normalized: Every primary page template now exposes exactly one <h1> (dashboard, time-entries, absences, calendar, timeline, reports, settings, personal-settings, compliance-dashboard, compliance-reports, compliance-violations, working-time-models, admin-dashboard, admin-users, admin-holidays, admin-settings, admin-notifications, manager-dashboard). Previously most pages started at <h2>. Subordinate section headings in time-entries and absences were promoted to h2/h3 so the ladder no longer skips levels. CSS rules for .section-header h1 were added to inherit the existing h2 styling.
  • Manager dashboard breadcrumb: Added the standard "Dashboard › Manager Dashboard" breadcrumb to align with all other primary pages and improve orientation for keyboard and screen reader users.
  • Calendar loading state announced: The "Loading calendar…" placeholder now uses role="status" with aria-live="polite" so the loading and ready transitions are announced. The decorative spinner is aria-hidden.
  • Focus indicators restored: outline: none was used on the timeline filter checkboxes and the admin user-picker items, breaking keyboard focus visibility. Added :focus-visible outlines using the primary color for both, preserving hover styling.
  • Mobile touch targets: .btn--sm was 36 × 36 px on mobile, below WCAG 2.5.5's 44 × 44 advisory. The mobile media query now enforces 44 × 44 px on small buttons; desktop sizing is unchanged.
  • Empty-state row for legacy index.php time-entries view: Restored the missing empty-state row when no entries exist (parity with the other table views in the same template).
  • Reports access fallback navigation: Replaced an inline onclick redirect in reports.php's no-access empty state with a real <a> anchor so the dashboard fallback works without JavaScript and inherits standard link semantics.

Removed

  • Stale Nextcloud personal-settings panel placeholder: The old personal-settings.php panel rendered inside Nextcloud's user-settings shell with hardcoded vacation-days / working-hours fields and reminder checkboxes that were never wired to any backend. Replaced it with a clean, accurate panel pointing the user to the in-app personal settings page (where these preferences are actually persisted via SettingsController::update) plus a short GDPR data-rights note. Kept the legacy index.php "settings" branch (dead code, but still in the file) but pulled the previously hardcoded 1.0.1 version string from IAppManager::getAppVersion('arbeitszeitcheck').

Tests

  • AccessibilityTest hardened: Replaced the "must contain <button>" assertion (which permitted pages without keyboard-reachable controls and false-flagged link-only panels) with two stricter checks: (1) explicitly forbid the <div onclick=…> anti-pattern and (2) require at least one <button> or <a href> per audited template. Total suite: 455 tests, 1 652 assertions, all green.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature0fmMgh2k+umrcI0ItziUajGlS8QKeJdFr3fCSTgg7vQVWg4BCFHonpEcUwfa4kVlfDspQKFKDaq8uOHKCgIK+UZwXyjxXq7+FQGRKfcyfOs9rNBzg+B3VAx4nYo5grNneYtAO7t7Zxz66W0ZFlpBqhNrJMY6TA4bc4tNMRGaIAFi4gXqLstp0Ah+cGqywh55lNrOeuOgFrySRtbChjo6fRhkdAMWjY4XvKxF+5QqtH44AmfQ2HGqOHe8NOjn8eUo0fMbKIbwvAZwafZ0NJQxxVDT9BG/9DpCmvFDug4URG8yKIQdbbmYotaJBw+l4PEiEjpzRJGX0I2yzRaVvGCu6j5ZF/8YYl/K75EFv3oGc6VgypIcoK93/1WTXzykjwVMPxAdGv50f1muSJrVa+6Qcw/j4pz2aE2gWEZ8x1nANuxlxlORcVZkpvPCuDFD+VcqejaZon8vzhW46eENcjGI8oJR1YXRYR22gN6BNM5KD/NPbDmQ9DSsZDgp42lZ34L5+VWj1Gqtf4iqMM7RnZKvxw3bMTFL8usH9lhfjPrqtbzQLWmpiH7Tpwr9Law4ZkluQep/qWR386FPRCOtCOtsIs97GMEM6jqka/uZ/M90AP9v74f8nK/+c6oYXGW+Fq0SKkGvzXFczs2EokKRmyeIyNN013xyazPE/WCUcdGbXtc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.7
Release Details
UpdatedApril 27, 2026, 8:55 a.m.
Changelog

Added

  • Critical workflow audit checklist: Added tests/WORKFLOW_AUDIT_CHECKLIST.md as a concise release checklist for time tracking, manual entry corrections, absences/approvals, month closure, reporting/compliance/export behavior, and public error-surface expectations.

Changed

  • Time tracking mutation safety: Clock/break mutations now use user-scoped locks and transactions; status polling remains read-only while automatic break fallback and daily maximum enforcement run through explicit mutation paths/background jobs.
  • API input and error hardening: Report, export, compliance, manager, and time tracking endpoints now use stricter date/time parsing, safer validation responses, and generic public error messages for unexpected failures.
  • Month-closure enforcement: Absence update/delete/cancel/shorten/approval/substitute flows now re-check month mutability before applying workflow mutations.

Fixed

  • Health endpoint fingerprinting: The public health response no longer exposes app or Nextcloud version fields.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureT26RnSxGZtpmkWUMOT/kRj1pbj9j9dZCmH4GEaIONGYsjG9eFIorh133vbuxQbf+Ow0asxbdP0zK3CUa6iW6FhQkyo2Uyj0+BBVyFPliahtPKh68I8/YcQLJLnzI6i9lZhSCpy7gdMwr5xH14QVEq1gW9nlFA2ppepB0TJVCjpE9Ykc6egd1Fb28mr1KQcgYD39fXKG1R1rfY604eJtjuAnKomAkWecOPaUlElmIR5/QTBYeIthZV0fI79PfrcQdi1AjPIxQWx5mtvNy8vdSyah119zrA/Q7vJbh1i1vshxl65q5EKBh/Qam2JWadnVcfC6FH6CZwLkZwrkVlhfgAHhjRH4N01Mc3fRIbMTg+nKzW+oXANXnWyk8wtLf39wN4Qum+H4Yx4/ECG4aNULfPQki7EUdcLANlafsHKBarmYzITMnCPIzmKbQ/a07tKEsI+36C//sdfV2r15CMxkDfqey4NjtIbb8jv0ye5iv4gZnvl/FdyRaxLiptRiRxIRoFJgVMG1ZKxy6jw4MmIigONvQJ9Npn6//8vAdb80ftJvDCkyHa4DPmKHPoIphqFLLnSWbaUKn+KjfpDYom5nV99ccQlcdWqs5aXHLQR2UDv5gG+NCkLNxLNZcHLl6blsnsqnLGsnjgYLzYKxKJanBSvPkvO5nrpNoRM/3ybV4nWE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.6
Release Details
UpdatedApril 24, 2026, 10:32 a.m.
Changelog

Added

  • Absence approval forensics: Added approved_by_user_id persistence on absence records (approve/reject/auto-approve), with schema migration and API summary output.

Changed

  • Vacation entitlement snapshot integrity: Added deterministic key-based upsert on (user_id, period_key, as_of_date) and migration-backed unique index enforcement.
  • Concurrency control in critical workflows: Absence create/update/approve/reject/substitute flows now use user-scoped mutation locks plus transactional rechecks/row locks to prevent race-based overlap and over-approval inconsistencies.
  • Release safety: Workflow/unit/integration tests were updated and executed against the hardened mutation paths.

Fixed

  • Legacy snapshot repair path: Upsert now handles historical malformed rows and concurrent unique-key conflicts safely by retrying as deterministic update.
  • Vacation balance write races: VacationYearBalanceMapper::upsert now resolves concurrent unique-key collisions via re-read/update fallback.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureFCaNQEccscnzM6rLSgigNgiMK//Ogy4aLpQQ02I290SKuEd1galIkTleu42bUC3jUHSHpnmIDlaOC359unS4KGTEy3nmCdndzTjnZo6r+Pbk9+/vFkufLmhW6rckhWRuZ5FaTDQEtSuZXf/xGdfbdoy0emnIb+n76unzaXXDRbRwiofg80WVWY3ejgfixFajIBo0pYBiWHsjvjA66KtZXYxALqBikSLtr7Qo2BNssYqyDpxnPXjrpabkjwefBgBEro9vtBMgdxO1BiXf2R7YQK7tdea1b1+Z0SPhktPHoetniDAHnLzFucaQdwMVT4jiqwldo5wArfOLOWnFHa3jBDLUVc3RCov3/euMcr2GKxwYR6Zxjuwb++CAMTv4wKuKhju4tfWm6KQfUXCVMciK56XxAvwhf0FzlGBpT0+YORUBc7r0OSm1SbO5R8E6wOF6sUM9QhQCz+VFFyo5QEXxME0pV+yDzFFCBCulYH5VFq+cTXXZ9Cg7LaafpLP0dm3xJ+bnjLf/sNziApiMCQsOvK5DQ/tH6NS1qf87PZdb2FeciFFCO9eZw5JP842ePPPdbfq6hhz36BOv2gHqY3b4ze2H8Jp08II7/a3FWKbkz0nXN0G0HLQYDkBAa22Sn/c6Io6hGcQI/0fuW8pHJjhI6VgoCZpdY+dVD00/7Pu/HXw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.5
Release Details
UpdatedApril 22, 2026, 7:23 p.m.
Changelog

Changed

  • Release packaging refresh: Bumped app metadata to 1.2.5 and regenerated the signed release artifact set for App Store and GitHub publication.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureZpb9Oh1bIRpGiO5z2K6o3xhzr43wa8RdfzfLXHg7sEGwS8tzN8GaAdyCnk4IoZbFQbrcrwdyFCK2ifzBqN9OrxHGAqGpFLeQOaHUDcH/imXCIFxYAch8kwW545iujuTkvSBdlIFa+DAG6lFFRngQPO2aO9gC1B0Vp6wLTAjI5NDNeM6nVNyCIhbvaC4jUfIrTjrCfvgQ4hgpJ29pYU0GdY6bEgwKCQQgUuJVEB6Hoay1M40Xq8eLzdT/UfobFlC1nV4Anda02g1AeoM04FrJQUfD6lCo0s5pFYAJ82EM5OyzWwi/xgEv4y54tao/UBX6yoUvIdHa7yh6bfoKy0dQmzb+iHl8eQTAzCVQAgWWu58F5J+k884kYMwBNBdcuymPnszTlypmrQoRRjvI+UI2f8taEikdX2EUAbwHkBU8U8CG98NogPFy/w9drgLqq6gvBCtuuz3BLC7fsEfA2/Lx4XYEwCdbvoFMc2GNZJMIujhs1jsbk0Hzscz3NCmaILzbZpfKr59xfZy/bxNl2Yi8nl6L9tJRyaLdxJ7urZthACHIdATnAqGretxEcTox69OnoR+Pir+0N/8ujZ3Z2K2C/5zu/QGwGgaz+WeoKCwGjmTb3JCG3jh340kFLnp8TnzUiZpduSj4Bz4o7yojTzFAPoQrTUYZrv0llb8PGSoPI8w=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.4
Release Details
UpdatedApril 22, 2026, 7:18 p.m.
Changelog

Changed

  • Publishable release refresh: Bumped app metadata to 1.2.4 and generated a new signed release artifact set (archive, checksums, and App Store signature) for App Store/GitHub publication.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturefOspm7RunA6JBPSZZ3vwdD+rRVZ5qOeMbZFcndytc+ZU00QoTdCYDFaEsDlUZtuCnpLGgwQ1x8o0jBhi409JtsZrNyD99XhzBZCKNl/nysKo/jDLa3h1msZ/AWKtjJUlyLxEPvPLzM2e/bg7DVOJKi0lsvq6nmUxJEhlLmhdgaONOlbAsBdtrtTKOO7DSxslFRRW0fmofVEdH8lL+5y0l/RtV5Gd6bMtpQ5bzHSoai9OMuOBFJ98QX9k/vX4qAuJUGVRvivJmMXDmiD/kPvezmia5no32RbXtYgYBUVY3Y9kfOza3mdFIwlHSD0bnjCI22QWUCBa5v59k+OuMPzPxCy+bzBl/M6Fu09TrNCDJvejpF/y9vKl7Wxgdz4ynaA2EZZ+RN15cGiTdOWVzjcWtnXBMSh9RCnBZqSCz8dFq1qVLUy16lBciLRNa6HofkEvemUN1oLbokZKLQlyXMFNxT8Ny3udUaOa5qKFDLbwgTttFuHDfn4NWOeI7JQgJ5kntg2KMpB4VYXvDwODCEcolniDL08kWuPbxOxd0tTR55+seYBfrSQrrGt46a4Vcp683MvMn8fx/el7vSPx9ifD1cUd6KMf/fi5IJF+pohxoCZlNepNdQGmaKNfWh87EGsdUl7089uKLWdwGWeGoHdxrBuRBhcfIU1HvCH+KVcvT9A=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.3
Release Details
UpdatedApril 21, 2026, 8:11 p.m.
Changelog

Changed

  • Release packaging refresh: Prepared a new signed App Store/GitHub release archive for the current code line using the Docker-based signing workflow.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturexYrrvEAHPwtfVHCBhNEEi7sX2LvqPOYNCC1AOYXNIeoRkUCxYLFTc29MwrgaUMoSLGtoZDChDD2eKsUH6MY+y5Jk79dKZg/ngf2/YBQpmMevl8Lp5eSGo2QES6rBtWYa1GFOEd6sVU6RLcy9tNL3toOxw5Te3QTskzeamEGChd0JYprcLZSWJG1kRu8Y8c32p5Rwbwu1tuq3AAW+i/6Bq4bxztKR6PGkZ6uyTbVaW3p0PwMFoJxceVu0/MsbMpftQaGQHr/1h6nBvbuj1WBkfi9W0PHrl+0zRn+5FwoUU9dECfeHuQAAcXOcJsKT979ewplb5+vPgNSeN2SSTWoGs9eYYIvUzznpyhuqSa1aplwXO/U0xyTXeUE5fiAQFlbnxtZ7gjmeLBkbAR/gF4aCX3NEPGLtw24gY8jomJ67+foeoM1+AJM73aFgTH0NjYKUetACRTFgB6gJPXl97JrJxd7sTeg6xiqlNKrWSvxiAO8XkjHCUV1BaPmoRtyfcNnLxmf0MGCVUuO4btz7JH5qy3q4H8XecbNYpnEeer8qxzTkw3toonE4+LVgbHV0nW6uu/gfEvDtYZI0wKx/A4vQYSQ7WEprMn9SbjnXbaMFOcG81GT2HifhcWZH0/YfFzz+sRng/TvZOkuf2iUq/9EjnKwkyygMSlHE7Si3kYXldKc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.2
Release Details
UpdatedApril 21, 2026, 8:07 p.m.
Changelog

Fixed

  • Localized decimal inputs in admin settings: Daily working-hour inputs now reliably accept comma-decimals like 7,74 and preserve two-decimal precision.
  • Legacy hours API payload parsing: Time-entry endpoints now parse optional decimal hour fields consistently for both comma and dot separators, preventing silent truncation in backward-compatible request formats.

Changed

  • Input precision hints: Updated settings input steps/help text to align with two-decimal hour values used in 38.7-hour week scenarios.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureeG9EHR4R6Kg1X8OQ9g5Q0yPR7Y7yp+snb/sVhhLXEOtBIFd4xLZd/xi0GuLYF4KBZlPCH1GbRCy+q/kbjx7MyqlO2rHn3Cef0MnwJoLp9czZFJOjVJJpkoZNf/o9hh2OpeK+sNS7ghXfC5Pax2oicQFmeQeKQKLaTwn0AcJgvQrF1laVjQiXQopE98v16iClBjZ+KuybKcRmglxbd1N8dx69nBB0uyLQdkQIhnwHccyrlPCBzsXq55AtIEXGsitgXtquHKOk1bzBwM3uwQZoNRi4RIB/zWmOv0c7+71QTw0i1DMUsz+FUrTw+bBY0FnZe/Q9ageaUvwOb4bHUJYt1cuWPGEufAUC1w7ONCfHGASNkDv34msX4MQEaMf28k8ohtWlX/fzNIxL63Erijyanuo1tf9hZFeYEXmCKwXAeWOL0O/lXWcTGTvEOAD96sSv6RIcIOwHBLqxGUHiCQzJkKZJ3hjv3rrpOeneCLOz/jMNJrEgYCihLn1J8cUEPPeP6VH3rNthDuQOVCi63v+0X1uubbM6DQheViBYTA/z4wEAP/2YsA6rsXATB0JR4pOIxlsiT0MgjxIyrfctOJP/4zMU4645rSmZE+NS0TF46gpf8DF6ai0zilMmaHf9xY72qGZTICjvtIUcmwbMhRMqG9fmYomv5U2/jd3rubayPDg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.1
Release Details
UpdatedApril 21, 2026, 10:50 a.m.
Changelog

Fixed

  • Paused-entry recovery and lifecycle: Paused entries can now be accessed again in edit/delete workflows and are consistently finalized as completed when edited with an end time.
  • Resume behavior for same-day paused sessions: Clock-in now resumes a same-day paused entry instead of creating duplicate automatic entries, while preserving the pause gap as break history.
  • Historical paused leftovers: Added migration Version1020Date20260421000000 to repair all remaining orphaned paused rows (including cases not covered by the earlier one-time migration).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturewHjRsCMFlhEA9EgrgvzuDGiwQsEIOmqNFH9oA9Fs+lJZOluUc6XSmPeZow7uso0PwR/b5YYt+f8KmOoIwuJepnD1TTa5ClzBP5zx5gZq+KIloaEGzVPTnHvHJuc4V8q4A5BYEXvYrVvEuPgufr8BOBNy4SLwMKYQlJR0LhDLn3ShHowJ+VDaUSUjOtUih0uUCsNI54HhaAAa3EfKpgDqc2+jhM7WvnIzDGRVYF4HbPBYPpn+1eWOyOlOgq0YIy5M8+4shNLiGeIRo7Uepk9+HnDm6vjLdYB2iE9AMl+vSCGSdQTrP0Z5ceXZBZT/bM0t4Af3EfAP5seJ/sSQIYs1a5T8RIneJ7DwyFbZdGelFSSBZoMGDevr4IUUfAB3NIKNlPZsxAOv9elrF4AjLJZhDVB6i7OSVeER7yLqrIgMhBFXiFpr095gYQ7Wn6VCcBWwWVS7cWXa0xN9Yl00mn0z9GcVagRvncJ28Y0wSgk+GP/BDalUHmD7wHSL3pyXIWxpqQ2OJHi/xT5Myx4T+HVsywgRwAFaOLjV+hm8hkJLxd70WG0e1oo21m/DtTZZ1R44+BDdRGMJIcabWxJ/zFhYSZvVmoL2dpUlJhPgBBp1Y9Xp5pF0zOeLiGSMR4ON/Iys2jpsbAd0/TxW55NaEFOpZRRNYt3VoZJ8oqM1n1sHZX4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.0
Release Details
UpdatedApril 21, 2026, 10:08 a.m.
Changelog

Added

  • Vacation entitlement policy engine: New policy-driven calculation flow with support for manual_fixed, model_based_simple, tariff_rule_based, and manual_exception, plus admin simulation endpoint.
  • Tariff rule data model and APIs: Added versioned tariff rule sets/modules and admin endpoints to create, update, activate, retire, and assign policies to users.
  • Entitlement computation snapshots: Added persistent entitlement snapshots (at_entitlement_snapshots) with calculation trace/policy fingerprint for auditability and diagnostics.
  • Admin notifications page: New dedicated admin UI (/admin/notifications) with HR recipient + event matrix management and a dedicated notifications settings API.

Changed

  • Vacation allocation integration: Year allocation now resolves entitlement via VacationEntitlementEngine and returns entitlement source/rule-set/trace metadata in allocation payloads.
  • Policy migration compatibility: Existing user model vacation values are backfilled into policy assignments during migration (Version1018Date20260420123000) to keep legacy installs consistent.
  • Admin settings flow: Absence notification-related controls (carryover expiry/cap, rollover switches, substitute-required types, iCal and substitution-mail toggles) are centralized on admin notifications APIs/UI.
  • Working time model schema: Added work_days_per_week to at_models (Version1019Date20260420150000) to support entitlement formulas.

Fixed

  • User deletion cleanup: Deleting a user now also removes vacation policy assignments and entitlement snapshots, preventing orphaned policy/computation data.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signatureu3gPfbToOow1ecZSrYUbhzoOp6/Fb3syYzSdx9CNYBvsUDqkoBODyN714AKc/4PF8hYrf+nk+A7ICF0GC94uBW8MsNWCHRQ1GEmhhaNSePTNjV+JCCOR9SINE1JCYVSh4avkBX7evJrRZFTOoxRGZxKBSY8ubYG71+F/N22A3qH8wzu6yYMBi0hrt1oVOfFkhrkBKeEwip7Bm0vrEzfrhnNJ3qsqf5q52F9sxUFZNT+/JLDBPu/ZAokssMJGTgbmKwdc3qQzdI/d0zNPuZJwUNjjgvU+TLeFJRkOKNghRfdkVotVcm63NmAf9afJJx3QkCTOTbMchC9sKyvlnIbG68WUZvsiAUPRW5o2XxXK71zZo8y+GC65ZazjioV/4ANt6sEItnJ0MSylRmWFEXMTMJHgCiqqp9hwZwxs0IicHLsRRsnUDdT7yMgOdB7082cnUFJtWM9Me2uSvYx4QUfPosWZhkMqpwagxJ80EnYSfc12/cEXbr58MbdqyQeCj2dUG1iBPw0eVooOWxf9UwOnNaUKV6ynEGok/mYM3qS8XnNElFpliKoRAfBtgLsCpV7O/ChhjE0gPNILNasGMiofSaAd4cHZjSZI/7Cm6FkOSrGju6XCPubM6XeYLbyZ8pv1htd1H1NzUIsWYXG23nPhICNAdOvEcbIXWEw8H5b2Xtw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.14
Release Details
UpdatedApril 14, 2026, 9:48 a.m.
Changelog

Fixed

  • Approver deadlock (app teams): Absence and time-entry correction workflows no longer treat “has colleagues” as “has a manager”. Auto-approval when no assignable approver exists now follows TeamResolverService::hasAssignableManagerForEmployee() (explicit team managers in app-teams mode; legacy group mode still uses colleagues as a proxy). Prevents requests stuck in “awaiting manager approval” when nobody can approve.
  • Time entry corrections: Same assignability rule as absences (previously used colleague IDs only).
  • Admin users API requests on /index.php instances: Refresh/edit/history/update actions now reliably resolve app URLs and no longer produce invalid requests like search=[object PointerEvent].
  • Admin teams and settings API reliability on rewrite-less setups: Central URL resolution now includes a robust /index.php fallback when OC.generateUrl() is unavailable/incomplete in page context.

Added

  • Repair step ReleaseStuckPendingAbsences: post-migration repair auto-approves legacy pending absences that still match the “no assignable approver” condition (idempotent).
  • Frontend URL security guardrails: Shared AJAX layer now blocks external cross-origin calls by default (explicit allowExternal: true required), with unit tests covering URL normalization and external URL handling.
  • Lint guardrails: ESLint rules now prevent introducing raw fetch('/apps/arbeitszeitcheck/...') and implicit external fetch(...) patterns outside approved abstractions.

Changed

  • UX: Absences UI shows an informational callout when app teams are enabled and no approver is assigned; detail view shows a defensive warning if an old pending row is still stuck (until repair/admin fixes team setup).
  • Frontend architecture: ArbeitszeitCheckUtils now provides centralized getRequestToken(), resolveUrl(), and isExternalUrl() primitives used by page scripts (admin-users, reports, settings, validation).
  • Mobile UX consistency (WCAG 2.1 AA focused): iPhone-safe-area-aware spacing, improved touch targets, clearer section rhythm, and better visual hierarchy for normal user pages (dashboard, time-entries, absences) and manager pages (manager-dashboard, manager-time-entries, employee absences view).

Documentation

  • User manuals (EN/DE), tests/WORKFLOW_ROLE_MATRIX.md, and developer documentation updated for assignable-manager semantics and repair step.
  • README and developer documentation updated with centralized frontend URL policy, strict external-call behavior, and mobile/iOS layout guidance.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureVBSDJh3veK9J7eUDKGFw/xB1ypmBQrjMDzamatQfncYem1qg9kNVWAnHDH+fGRlFJtrBH+fOu+MRTFZuK78DU/W18IQglCtTbsH4MdaHLHTwVz2JOxeGJWmx2p1yK0ulK0vbDgCLXQu5B8gR/L/JYRGFo0+FpwuRvxrpp1BWrX5m9mQLgoxn3hOj2r+F2m0wYdEDWhksF6VzLbHyr3pIT9hu6p1owuAZzr3Nqtva4tZK0WGgn8xa5bDwZqJdWSyQJ04JiCZisftYCOJz8HNfq6o4MFTLF0aQpYxUH8wf6gz5pkfUOKIemq4Ui8GqRr3Fxo/DW2APAk0GcwWyY8ypEiY2RNi6IkGv3K9p8mFamDxirDeurOX/hwNia1Lt4HCqzJATjWpmaCEAoBQWfOCgozI9o+h8cI9LhHp3LvK3VxFD/s9xjJPFLZ9y8b98hufe13Uq5/NYzqo2vQ1DgQXyCbRjsiMbqDvz+yyDmXM+JPV8U8gTKxTD8y19VoiVIlWhAsI/zBmxHC84G2htaCHBws47cGhmJVvQDXGz/1aae9J0of1bGoOIERyEFSOAzmUN9fcvdVbN+77wn70QQ1k7GQcw6jAEScIQq8Pt8n7pBTECeECk6K4baNfaTT2+kZKLCdD1mdaJII84B8+XXxmxIk+VI1sarNlMIvPAk3FQjww=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.13
Release Details
UpdatedApril 13, 2026, 10:46 a.m.
Changelog

Added

  • Month closure grace period and auto-finalization: Admin setting month_closure_grace_days_after_eom (0–90, default 0). After end-of-month, employees have that many calendar days to finalize manually; if the month is still open afterward, a daily background job finalizes it automatically (same snapshot as manual finalize). Pending time entry approvals and open absence workflow states block auto-finalization. Reopening remains admin-only.
  • App-admin allowlist: New admin setting app_admin_user_ids to restrict ArbeitszeitCheck administration to a selected subset of Nextcloud admins. Empty selection keeps backward-compatible behavior (all Nextcloud admins can administer the app).
  • Security role-gating Docker test target: Added scripts/test-security-role-gating-docker.sh wiring via make test-security-role-gating-docker and composer test:security-role-gating:docker for fast authorization regression checks in containerized setups.

Changed

  • Month closure UX and API: Employee UI uses a clearer card layout, visible feedback for success/errors (WCAG-friendly), server-driven canFinalize with localized block reasons (feature off, future month, pending approvals). Manual finalize rejects future calendar months. Absence workflow (pending, substitute_pending, substitute_declined) is enforced alongside pending time entry corrections. Unauthorized API access returns 401 where appropriate. Admin settings: dedicated “Month closure” section; grace-days field stays editable with copy explaining it is saved even when closure is off; reopen uses searchable employee picker and clearer administrator vs. employee wording. Form validation error callouts use higher-contrast text and tinted surfaces across themes. Auto-finalize job logs per-user failures for operations.
  • Release/signing workflow hardened for integrity checks: make release-signed now signs the extracted release archive payload (not the local development checkout), validates forbidden development paths are excluded, and repacks the signed archive for deployment/App Store upload.
  • Admin authorization enforcement: Access to AdminController routes now uses middleware-level app-admin checks with a dedicated exception and a consistent 403 response page for authenticated users without app-admin rights.

Documentation

  • Deployment guidance: Release docs now explicitly require production deployment from the signed tarball only and document the common integrity-failure pattern (.git/* / node_modules/* lists) caused by signing a dev tree.
  • Deployment helper script: Added release/deploy-from-release.sh to deploy from signed release archives with safety checks (forbidden path scan, required signature.json, optional app disable/enable and occ integrity:check-app).
  • Admin operations: User/developer docs now describe how to configure app-admin allowlisting, what the default fallback is, and how to verify authorization gating in Docker-based test runs.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signatureol/yHOgiMCOj+yYqb8HC0g5laqPih/kTTbBB12bDawwgGQGVdx+GCBNaSmM8Sgu2jRB6PJWwnF1qFQQ6MIHWCjFzuOQeyL+sDEGH0VhI/qgbCmyRKZnBKAyUq9BBrxux3zaI6cN6QD76nP27UCU4C/OxW87nybYxy4WqqdOSOR0Af9QMkUg/VZLhRatpageqRGkYSFl+3ZwEg8qhlpDyLH3lh3xSG6+tQsyy9yU4La+XDiZ63lG2yF1RWHQ1/irb+dRrPEs/I1wuLvdZL+6olqx7MTogIylUqrJyux7ycTUrC/sxTBsZYJUQ2vGFyGzO30qARQ+KSOJtai5Upcx7WZxHv98eS0X3FGI0QUhC2NwIE2ahn0mfH/YjuRW5wBn9nsDG03KPpDaMATyvxTD8BbzGTM9ziuMKfOzd2HfYxMWDX/GF4LWM/eXpqsO7E2veMjtIClAcMI6vZhJKVV4mxXHxMkFIdvTbaFmPrWEAhFRoI+0NHQ4y3ec+goBucU+E4gHCyicVOT0T4n3NH6U+nOs+95d5cSA85Dz+LF7ZLLYU/rxi1ybC36fVg8igg+P8YvH555KQNizrYNJ2xdglmirJcs0XcEwZ8/hVrWfzuLUgKbMNXlqa2dgRzMnfOy9b5bNUPez9FKsqEqAc66dUr9JnDiR+poFgQBlCAnZ7vbw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.12
Release Details
UpdatedApril 12, 2026, 4:25 p.m.
Changelog

Added

  • Revision-safe month finalization (optional): Admin toggle month_closure_enabled (default off). Employees can finalize a full calendar month; the app stores a canonical JSON snapshot, SHA-256 hash chain, append-only revision rows, audit events, and a minimal PDF download. Finalized months are read-only through normal app APIs; administrators may reopen a month with a mandatory reason (audit). Monthly reports for a finalized month use the stored snapshot. Database: at_month_closure, at_month_closure_revision (migration Version1014Date20260409120000).

Documentation

  • User manuals (EN/DE), developer documentation, and compliance notes updated for month closure, retention context, and limits (in-app tamper evidence, not QES).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature0mCLz3x6v/VzKxsK9I8J3HAMtz+lr9Z43v3UN+tH4hZeZLXvuXWayTxLB6EYKXXnNSfkvF5KMiYJqh3LJHUCTcPUgGfPqNDwCkkTK51T0cmghwWPQylVIe9L6My8a2Pu0sVCrG5P0Ev5t7wdLQNMSxKcHYKXYT7B2QvQG+ljdNKr1/ywfXDEpIg4yzCMnxVdfGIBiUNl4vUIYOXCNt30fUXiRCXHfl381LcA2Bv9ZP+Ddxk+qEpa1iuujWcRg6o32YRCESwDAO2IoXKEvLy16btLtNQd7wL+E6lhCfgST/jp+rWPxh4RSJ8kBlyaBYo8LqvhvMRpGqhYfNOJZTrq0BnKQZfjc1qnAcIHMDFjBfUwi8tp0/bmxOnXmMMFZZtGf6rGLUYinb470whWKydzhIib2K2kSTN9GrRvjmp+osUh9/qAlBzN5wRutIBewKqM8SkwJ52dYiYWU5jAyf3fVxXqRJs970WUccI7udQ8A7J9XqkmCRUBvl46mPugz0K481/X6cKHiZBK9681njxRWorGVGHpCiz92T+Ug2W+bRIBYLBM0oqPd9Dp2rXQ5+UFLDTC9eDG8WP3VVxsK7d5xtK/xWC1fSHy4c7Mgp8WAVITY1eU9ftn1tS8BHZxcgz7EvgtPmamoKwb55KKFTxQu4c6khCWaZ2pPQvXQjxtrNw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.11
Release Details
UpdatedApril 9, 2026, 2:45 p.m.
Changelog

Added

  • Manager employee absences view: New in-app page and API for managers/admins to review employee absences with secure scope filtering, pagination, and localized status labels.
  • Working time model copy flow: Added copy action with modal UX, unique default naming, and safeguards against duplicate submits.

Changed

  • Manager navigation structure: Sidebar regrouped into clearer manager/admin submenus; reports moved under manager context; compliance link placement adjusted for reduced top-level clutter.
  • Manager employee time entries UX: Date defaults and formatting/translation handling improved for clearer filtering behavior.
  • Calendar behavior (rollback cleanup): Removed in-progress direct calendar-write functionality and related admin controls/status/test endpoints. The supported behavior remains unchanged: no Nextcloud Calendar app sync; optional .ics attachments are sent by email for configured absence workflows.

Fixed

  • Working time model modals: Corrected copy modal interaction flow, source-model presentation, and delete-confirmation localization/rendering issues.
  • Absence iCal hardening: Added stricter status/date guards, recipient deduplication, and privacy-safe event descriptions for substitute/manager recipients.

Documentation

  • User manuals and changelogs updated to reflect the final calendar model (email .ics optional, no direct Nextcloud Calendar app sync) and current manager/admin UX structure.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureHwGRZcCLjb/plcL+LoYgcSBNEXoLoZU2DlOb7pcOx6X41OU6v9SkdO5YXOynEBr7kmViQeQzJfLyTUTRSfcqLlz4jC8KL7Xmaa7rImQ0EGSVpaBmmUuHC0MWlrhWWMEkG52smtFFalq0GZy0wLhcHRc6BtqCzilQLju2jS5SR6GTPWutj0i9LsbKsB6LFzkbc9cAbtcRCUjzx9A2oU/EAA1BhRBlyQTvR/OLyDa2FU/CBNWrm3I9293E+D9UP9gMBhKvSH5f1DXF/TpwiCEzYB/NRR0KBXvQb30whbv6O/WJfCEs9z1+wryRvNfGjT0+9X4C3tPtLTpyh7noU7NK7VzS0Cl0/TbACvlEY8yk9I+UPbNYA9jUiNny2JpAh6syrFE3k2RrhIpiJ9iLwqKgUYN2rlx6LFtqWP1NlIExC97DdmCTt1YRTyeDzi/NrZuGKHl5JBtCJWZalX6KwxjJd4oBrxoy1+i/2BLSpjoUlvPQ2FHPlqdtHWcIqryrVzmV+8ZJyxmo5EVJR6bmGESQjUovJ70j5KIltEg1OM/5MAyJ9hkIBJxjXiLTvocREbYOdoicChFs9aQFbDX0VN3BD4q6FNSiV5UXRsbzo57lxa4n51hB3tjoQAJ+rBlmMyVez7u1zNj+5X6lrvn7b5/5UQg2oHpaR8Hz1iPPou7E/GA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.10
Release Details
UpdatedApril 7, 2026, 7:49 p.m.
Changelog

Added

  • Vacation rollover: VacationRolloverService, background job, occ arbeitszeitcheck:vacation-rollover, migration Version1013Date20260407120000 with at_vacation_rollover_log; unit tests.

Changed

  • Frontend l10n: Shared templates/common/main-ui-l10n.php and teams-l10n.php so translated strings are available early across pages; related template and JS updates.

Fixed

  • Manager dashboard — pending absences: API includes summary.typeLabel (server-localized absence type); UI prefers it so cards show translated labels (e.g. German Urlaub) instead of raw codes like vacation.

Documentation

  • docs/Developer-Documentation.en.md: pending-approvals API note for typeLabel; user manuals (EN/DE): manager pending approvals show localized absence types.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturekmFxrMFQus0US44BSrw/0eOzjGU8zutOf6Q4Dqcc/39RNDiCiQOKB55We29dsKBZ77Qkk8fbitvBMURDmfLM21hqyrDTfltj77MNdonON7hcINJKQZG2fGLz3Rrc+10mDQDAiDqVQGOLrpJBQVuA+TxdUEA1C9+z0zwvmHLdlBEgXCw7k/4FoU8aKCA/Jcp02Fjr98PG+1MW5SbOtTs8oQG2iMpRe7Ogo+YzqZtU11KZ4tOr8zEblZeh7oSG+AaIlj16YscKKCWAL3MLmyRvYTXWpPgsu4xLp+AUvTGbSEKUlDeEznDDkGpUvVrd2pTm4Y7xyc8X8c/0WQRqWuioiqRLUHHldJg8MjgL4s7mQkqy95dfZ/xQRC9BAc/cbTceynA8PD5XILnQAVgVRe9hXsji6TgN2EURulrVsBbCN1wCAp/Be9FqH7NYiQYxhmVfYM3kmyMdVe/+owslEAaMcmjT/QcZQlCeJj5SNOXCqVwCsks0ijINP2utN0XO4mlHkCt712QwFAMw86rSjnuX7eA1W6w2OpFjFFobOekDaUgBs8ID4LMgpOWJSGTI2P9AHtBJTMNSrRmsMzQmafZYdBm2F9gO4tz9ktxbhcmBFWpTvNHZimE6Re354pnTOQIQ4yCKU+8VsqYEJxdxe1JYXE2yTeNCKOCcIywL8/hvVS0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.6
Release Details
UpdatedMarch 27, 2026, 6:08 p.m.
Changelog

Added

  • Development tooling: occ arbeitszeitcheck:generate-test-data CLI for deterministic demo data (time entries, absences, optional violations, demo app team) to exercise UI, reports, and workflows locally.

Fixed

  • Reports UI: Report type cards are no longer incorrectly disabled when a team-related scope is selected (team scopes still use the team report API where applicable).
  • Reports (tests): Team report CSV download test now reads download bodies via DataDownloadResponse::render() (Nextcloud API).
  • Team reports: Deduplicate user IDs before permission checks and aggregation to avoid double-counting when users appear in multiple teams.
  • Absence type badges: Stronger, theme-safe contrast for vacation / sick / home office / other badges (readable on pale Nextcloud palettes).

Changed

  • Compatibility (dev): Local development stacks aligned with Nextcloud 33.x (example: official nextcloud Docker image).
  • Reports layout: Reverted an overly aggressive “full width” parameter form rule that could interfere with scrolling/layout on the reports page.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturehE0UvSaJEnunYMHOd5u3aR+5MyAg2Pl78l3t75Fx494nh6CzImBfoaswZXb9agJ6Iz1orktgFsKlTqfZoSGNxuZHRiRjcbtC+LsLLQsjONX5i5UOXK6crz87+6TEDAPkgdr318s+w9qHvTic2kdcdx+rpqbBSMIAgU/GuVZjyp4wtCV2Ti9VFR1pFzAlmH95b6WVCQCdTYmWs7LsLY//midoEYCd8JXSicLvr2nobqTL/soYZdR/39931AgpiUO5B9Rd0Wo7NVhk8C59bmlNqkLa8UDZHTZ/Eseks/njP9CdRsgdaUiqIm3libscOPzoFg2abyJpIZUV/nV8acOq8dh/XNNVRuLxxHs5v5FcByrnuxE4G1IbyC/FtB1KFRQlGF+rwwSEzBKdkNCdH5zbJ//gEgRfjZJb/Ijtma9+14jeRub/oLHQx0Mkh27aVMBPbqDI8LeuOLWo4Gbd4RXFknth02gSZpk1/Ko4uE90R44RcO2YUS58qvKQkickIoDEQId9w55FIEyP7LIAZa2bXl9qYZAA+CHCwixsBKi3a+yADg/wWaN4roVQ4LobTjp1adPOOVWbTHSemHRgEsqpboMxRXcrRWan8pNiQrnvTbJwIu9i3Q6zgHtHXe6RviFMzwiMJQTdvLhhHuANr9Lt04cCZjPS2dWfjGCZKVfo7hM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.5
Release Details
UpdatedMarch 26, 2026, 6:57 p.m.
Changelog

Fixed

  • Admin settings API URL handling: Prevented duplicate index.php/index.php path generation when a route URL is already pre-generated by Nextcloud.
  • Frontend error handling: Avoided unhandled Promise rejections in callback-based Utils.ajax() consumers after expected API failures.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signaturedkvj+LT0qxzHO59iXnzyYCXDEgfS9OMri9yD8QWcQqS/VPzNKFBHIHDqX/2JmnEuQFM6sKf+jyx0QORDIAC4h2XiZoUlJe+MHgZQGGqa/mA/SGFQtwzlxWw2A4Drm1ioGkOIwhGo5Ny0zIogawfyhPtDQX7Mjj2K9x5+OSHQKtQs8LGRiyy7EsVJUC4fWworktCvuqRYpvR+rY2GfSu0CcWWZVItcEYqAfDFl3UvmWag299QrF1g7SOVY1EcoDH2B+O2mOwXwj6JjWNhz4iUkdcbkthaHPwZ12cUTOYLOtopIILuRTdlXiYWqYvLn24yZUObqmS0LbNcyzAF8gF8LDOmp08FxRCo6NY4L9HJcvgaR4qDkOpiC1aj/9FK8LmRnmdOvH9FHIqr2P6eBP4uoetMWoMbW3QAqvizVMDYPe96Qj1m/Cwp2ogV5+D0JOt1Ms02LGHZ3pcBp0vojoUu52pdP+dXL1d0ZN4rzSPEVQboJllQz4dyahtQ55l2EuDdk6VVf35oOPFLt5HqIF84tFYbY4moxafMunMI2lSWeRj0jCxApnTcrjuWDRuG8Q/fv3Za2gtkSsx9XNLPAb6YNOrgKFEeZRtSIp7L2V6shwxn9H4PG2uETboUm44RWkoZO+JZFtNTTlZpij4B5mRvo/OamgruxwI6YgplBQXObSw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.4
Release Details
UpdatedMarch 26, 2026, 6:40 p.m.
Changelog

Fixed

  • Routing/compatibility: Added indexApi() compatibility aliases for legacy endpoints to prevent 500 errors in the Nextcloud log.
  • PHP fatal errors: Fixed constructor signature issues in AbsenceService and ComplianceService that could crash the app when loading services or saving settings.
  • Reports security hardening: Hardened report preview endpoints with start <= end validation and a maximum date-range limit to reduce DoS risk from untrusted parameters.
  • Admin “whole organization” scope: Correctly handle admin organization scope (userId="" = all enabled users) and enforce access checks so preview/download data stays consistent.
  • Reports rendering: Improved Preview rendering for absence and compliance reports to match the actual report data structure.

Changed

  • Reports UI semantics: Team scope is limited to the team overview/export semantics that the backend actually returns (prevents misleading previews/downloads).
  • Organization download guidance: Added explicit UI messaging for organization scope download limitations until organization-wide export endpoints are implemented.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureB+kiXQiNbiYsWVOlB3wiTffKZj021JMzAUzhQRYuwQmpszoGICQ7cCChEeggNXAMuOsRrPkznqB190jArt5Sfp7zKL5I3Z7IjyH6ur4aAqf6Tddq93/6Vb4W4ud9G30AJhkh3X0PBZ98bcOPcrxiaMrOqHryaIkcQ0os1pJnCAZ5v/zmUZGz/rVHxc0VNUGGvJZnx8Odwgd0r9z3McM4r9LL7n9+CrwtDMOVS/fUwAapkdaqM381pkLCa5BHM8VJd+ARz7Tt8rPVuVBwXDR9pkq38eoD9tQ61QVbCqrfsf4/8LgcbNlrHjWVRrAtUirX38JlJgFBKvmzaORvsgylNFggcrZ7sIx4o29kPPkFWZaUee0TKI/uc3WlThNIj/i4+sVTZ2Um23cfon/wr/sHByJIMOsFrw60s6RPm/XjAxeTnJbrm61ms9a0kKTodDR7puH0guqBQJX/CTJUQxcoPmKcfVqqblI2Ll/efOzi/BHYEEuiMGRVfYmuwtlALuFODD8ALFhf8EYmnB2EyCTLJwR+1bSUQF6/a/p4PP9cVSRKDbfYY3rpSU/QXbM3XTn3fET1dqE98FWEqPK6iNKdoMrcsZ4gkKNMNYKpAjMB9kbemHOVPNCIDVTIkYsVQO/edieH4N3EPouwzLWCvQVqWpb8h7SPbTslAhg45WtVByU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.3
Release Details
UpdatedMarch 19, 2026, 2:41 p.m.
Changelog

Fixed

  • ArbZG compliance: Corrected break check logic (9h/45min branch now reachable; check ≥9h before ≥6h)
  • Manager logic: employeeHasManager() now uses getManagerIdsForEmployee() instead of getColleagueIds()
  • Reporting: getTeamHoursSummary() respects period parameter (week/month)
  • Admin users: hasTimeEntriesToday is now per-user, not system-wide
  • UserSettingsMapper: Fixed falsy zero/empty-string handling in getIntegerSetting, getFloatSetting, getStringSetting
  • Routing: Moved exportUsers route above getUser to fix route shadowing
  • Version1009 migration: Replaced MySQL backtick SQL with portable QueryBuilder; use OCP\DB\Types
  • Duplicate notifier: Removed double registration from Application.php boot()
  • API security: Generic error messages instead of raw exception output (SubstituteController, GdprController)
  • PDF export: Returns HTTP 422 with clear message instead of silent CSV fallback
  • LIKE injection: WorkingTimeModelMapper::searchByName() uses escapeLikeParameter()
  • XSS: Modal titles escaped in components.js; compliance-violations.js innerHTML escaped
  • Admin-settings form: Added CSRF requesttoken
  • AbsenceService DI: Fixed constructor argument order (IDBConnection)
  • Admin holidays and settings: English source strings for l10n keys
  • UserDeletedListener: inject TeamMemberMapper and TeamManagerMapper
  • XSS: sanitise team names in admin-teams.js

Changed

  • CSS: Shadow-light variable, scoped resets, dark-mode color-mix fixes, semantic color variables, navigation height/z-index
  • Clock buttons: Double-submit guard (disabled during API calls)
  • initTimeline(): Max retry count (20) to prevent infinite loop
  • Accessibility: aria-label on header buttons, label for admin user search, aria-modal on welcome dialog, English l10n keys in navigation
  • Docs: Removed internal docs; added docs/README; corrected repo URLs
  • Manager dashboard: Injected l10n from PHP so JS translations work
  • Constants.php for magic numbers; user-facing error messages

Added

  • Version1010 migration: Compound indices on at_entries, at_violations, at_holidays, at_absences
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturePf3DfgKP/j8T95ElL4ORpuPFeD3UHt901udriCVI1yQdyRJDTp5Z8tHcaFpLRjjmjW8c1nFIEjrFVTjl5UNnPTTWzwf1+Woci/TtIHa7lDkMftxjIIVMf7khRJ6NGriUQD1WVS6Hqdi+FWafgnIqn7dO728K+lB3rFSlgoCoQgQpjjJ/D+N5yynIi44wiD7F8PngozN58wUdWoW02zBX3W+ndpEZXmrY2srqPndhBrlg4cOrE8cWSUFe9wtwSaopkDZPSl85Wsg7nwDOJGV1JaFzDdBxyHATs3kxJnsntXePI1j/O8bcWR69o45JkDY458TsiA0qweFMx5A3Ioh5K0Rrp4UQREthUP83sEzQCIo9ztzB3oeFr1sAs+/dfauAPLsHWNG3NO70fZ82RnsRKuhklTbL8RQ6gc2a3rqrOLSPypyLsv6+UxyoKwm41cggNl4UnhyUhoa33IjBiEoZDXTfB2d+fNZoTXkOYZdDTKcC9bNMc+mo8guNkTxqAYw8Ian0V7vmLs0uBJ9JYyyy5k8AUd+8ijMokWm/2VKPCbDga4mmZevp3KqSpVOqXYBJXmMzJH2Vf+LXZYjRHTScFQ92bXVz7VRRNoz+LEtZy4QYIT9u+YCIvu7ddT5RZmA08HIWU52W/jWQQiKraZE/Nw8Ks4VQBfB6TX+wDCGadBs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.2
Release Details
UpdatedMarch 11, 2026, 11:36 a.m.
Changelog

Changed

  • Long-term refactor: Replaced all \OC::$server usage with proper OCP APIs and constructor injection
  • CSPService: Injected ContentSecurityPolicyNonceManager via constructor
  • Controllers: Removed manual cspNonce (configureCSP handles it); injected IURLGenerator, IConfig where needed
  • PageController: Injected IURLGenerator, IConfig; passes urlGenerator to templates
  • HealthController: Injected IDBConnection for database check
  • ProjectCheckIntegrationService: Injected LoggerInterface instead of OC::$server->getLogger()
  • Templates: Replaced \OC::$server with \OCP\Server::get() (OCP public API)
  • Added GitHub Actions release workflow (.github/workflows/release.yml)
  • Updated PageControllerTest with full constructor mocks
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureVdOLtKkuJFOvqioRam3iZGmEiSQrA4Xc99thIdm97dMKFlfHskcRIG34rWiqftbbIh+6CgWWxu+YdQOLSV63qOtZ7rH/rl1x5hnhaR4GBDbTtnE/frmfTJYlpHlKVw9KSyniEEAE30lLl5tuYA/4myl+9N6abL+9oJpQo8nAY2oApVgdJQFHPvUPeaJ6q0Qb6GUkOTwZo/UgmT0cIqTL7Ymkvkp3OGE1nRr2hD+T5aFyXu0E3IfS5m+eete4Xdn5TcSYzWVB3oBdMxmRTUtracW4ar/ZstAIwsVxmrLcW4/2AgvUQrrAZ87EBNNoiekUF+nJogWpFeh1n6lN7ZbuUSQJaQtlquovukPbnOgO1AAFe3EMG2DmBtlbyn/jt8/DY5ql8VTDp62eKDJxYTodidjAQYkqMEve7XuTtPgrNwG9c4hFNYS5fIGz07ER4otxErRKC25d89ql/bkSDre0IZPw/gTgdEjx71iD/UZBf9b2tzhMKpNfdtlkT0BV1mNOa376kZzYOk9DcpAaOgobPK00gb3ZeeODGn29N8LEvEAI5SCoa1m7eT4B0KbMQNtgDEUNZrrvRf3Tzpb0mL2QUmf5i3sn10IjQ6KdTDor1xWFEYIF03M240Dw5ml/UUrDgvXI9WZ1BzgyNDe2HAVeNPb9akpPHUWYkoe+uOoaf7A=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.1
Release Details
UpdatedMarch 10, 2026, 10:18 p.m.
Changelog

Fixed

  • Resolved duplicate route names in absence API (absence#store, absence#show, absence#update, absence#delete)
  • Corrected settings class names in info.xml to use full OCA namespace
  • Added declare(strict_types=1) to routes.php

Changed

  • Removed non-existent screenshot references from info.xml until real screenshots are captured
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signaturec6nuFK9N2O61bf1GpNWz2G2FDt1GzTRzd2pXna6x5E/HI/m1e1dt8TheGnhfgYm/TY/o/W539hak3svOJbJmoJr/kmd7xVWRGnZH/PDBjROe5kwRIwWdZlR3z7DiOyTsZo44DBLvVFEaRMAjF4PpVpJxTIA0xV59d3YJHyFZXbMPxSvAbZu43bAjWU6kVGmfaKUOrW5d592aApbxQ+mwJS7LwFMXlxGSzyCTwYL3bMkwormPPS64RTJtrPhvImU09ACMsjwgERAuFGlvbGj8CiuXzAWoO7ISyxcsqiaw1jnA5OIlJ+hnQhUdYHtkIzdwNHxw4ItSBL3pSJjhwIyrs4zZRMkOVjTqDluDfmvbx3Ir9cglVHlMGGTOOJtuyU0PmL0Fo9HZ2R0Noz9w8T3cpetxRG+B+mSWapUblbM+BT6aIvfHMjSzvI0qjwzcczwVzkYJISHReObwYFpeVs5W7cW1gXY2mx42Q/fPqDkrM5wEiuYJ98QG7Y67uhYZce9wmAp0Pygx0UJILj4fNPLuA27hVOp3++x0rOxhEl1A4v0tgiX5pVRYK3qwf1vHFl3zSGgldQs2WUmJ6CoPWbIE6hzmtRUGMzSOnKEK+2eLHej/Edzdo75nVZd6maKXVAY1L+z74IK61HvJ6kQ0QXFO7urWBZJg+IfxzR6W4mrvZnY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32

Nextcloud 32

ArbeitszeitCheck 1.5.8
Release Details
UpdatedJuly 18, 2026, 11:18 a.m.
Changelog

Changed

  • Mobile / widget home payload: impliedDailyHours (contract daily target) is included alongside weekly hours so clients can show “Daily target” like the employee dashboard.

  • Session CSRF restored for browser cookie sessions on NoCSRFRequired APIs: mutating clock/absence/export endpoints that stay NoCSRFRequired for mobile Basic auth now re-require a valid request token whenever a Nextcloud session cookie is present. Mobile clients without session cookies are unchanged. Forged Authorization: Basic … headers can no longer bypass CSRF while the victim’s session cookie is sent.

Fixed

  • Absence cancel/delete/shorten race with approve: those mutations now take the same per-user absence lock and re-read status under the lock.
  • Status-path stale-pause repair / daily-max auto-complete: side effects run under the time-tracking user lock without nesting an outer DB transaction around a second lock acquisition.
  • Manual time entry create/update overlap races: overlap check + insert/update share the time-tracking user lock with clock mutations.
  • Month finalize/reopen TOCTOU: exclusive per-user/month lock around seal and reopen; calendar “today” / month-ended checks use organisation storage timezone.
  • Compliance cron / weekly average windows: use storage timezone instead of PHP default/new DateTime().
  • Absence business-day gates: “today” for cancel/shorten/substitute rules and vacation allocation reads use storage timezone.
  • Dashboard load-error callout: keeps aria-live="assertive" for screen readers; clock/break buttons guard double-submit client-side.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature1YxfevMESrUM//nCGciUukkJUENnGK1Zx28RQDbamoI4ObbLwsvsf3iXtY8HSWvdXU/CcaaIkhoTz1AgoDrrc9hEuKgB5n+wLwSasEnCOFuEB97+cRXwPFInFhWY8l6At1iKRcfa6CI/dQoGL39p5afqFF9LNwASQj3t72wAGMFUn582kRolB1QoKJH5YisXq3hOUfkRRxmCE1QYV+UPeTvxhLvFZgN62CZC53ZQl7q7xVvPUIszduNjkdzfa3h3phb52+cU0XS5jd1KBXzJPdP+JKAo07X5ctW9w1N1A854M0NViBcm7OsWz91eQTI0Rbbn8AeClAMMX+hD/x5SBLmP1hw5sveGM6aX9W68rAqy7A1215xvAwqRMHHe6Nccd6zLFUvh9Ll2SEA6E3UNbch3IgtlhgnBxhOjZMrVVUjci82Ue0zrIN6MFLI5yCWYQ9c9m9hSfDeqj0X3mjD17uTsba3l0YgnBV6WkoYcwphvDETTEd4QRPw4Yy3nm5cZ9JvWN+XG2wL7xuCw7O9/rQAIjXDlI4FuG577wSjEdTcgiHMeHsB1aA5HKdxMyRth60FhJqEveOxOJ3N9RUQUTpSgzVbJxablgHSt3r4QABIWQahY79VYUDLYXmd05v+PZWAOWUHS6waOIdM8NHRIfvVLq3qR3WVoSftNVN3I1VA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.7
Release Details
UpdatedJuly 18, 2026, 2:08 a.m.
Changelog

Added

  • Auto break setting exposed to clients: the dashboard widget data (and the mobile home dashboard payload built on it) now includes autoBreakCalculation, the personal "automatic ArbZG §4 break insertion" setting, so client apps can explain whether the server may insert breaks automatically.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature3lsfEckilfrV40shkUALmCLcnU3GVW0m3VI/iRg1JxxcpMSBtmCK+OFGPo1fKN3Zz2gTicFaavr/4pfdl8oD2HUCMsRJtzt2URItVhM2cEybhBr3G1p52hQWVoFGBb/1QOKflxFcbSAf7QLvA92Cje+qb8TUjyM5uNKLqEq/jr9y9nEH4afvS2LO8s47+akQn10KnlROcuIb3S6wx7yhNQUFsHnKYdUetzZJgTCxBFFrQ0llfDmFAJhnh1GFypqZ9MPhjbXqQBJ/lB9Unk/pekQqxaMREBY/K0gG7JEhmw6SPWcX5aGU3hmKvFLZB3lfWgt2EH4viQ5c6F/wqkM/fRZqZ4y/0kLHgr0KxMS/iJBTOISyGFxv31yEHQGbrUo6Rfr/8TXFYGuV2f63CyZIEe1s8WDdsGkakm+OnJTLUo1Rxu8s2LbECQJWYpIA/Xn546opsRPFtGFPWAPKJesHjmut1tKUrctx2zJxU30GFOkQ+U+nRrx2HRYGhJze+7OKxXCaW9imtsheFdb2AoPBmj12pN3ZHMWKjR4Um+v7LWKbOKjo7wzNTL85PsVPG8pF3TZa72jqqOZEZH34ayeUiv3n0lmt4aStaB3HYwb1yZOjH1oVZOhKmunDs4+naRLLweixcYyICLpCB6IPHSeByvzFUqxfmCAtaev1arL6FvQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.6
Release Details
UpdatedJuly 18, 2026, 1:33 a.m.
Changelog

Added

  • Mobile home dashboard endpoint: new GET /api/mobile/dashboard returns the full employee home payload (status, vacation entitlement/remaining, week hours, balance) for the proprietary employee mobile app, instead of the lean desklet summary.

Changed

  • Time-tracking status endpoint usable from the mobile app: GET status no longer requires a CSRF token, matching the other read-only mobile endpoints (still requires an authenticated session or app password).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturejIqTDpn3RCL8GdRV6/c46TD79xYOm5/UalYDOBjwkEukzMomLSYYlii5dfXyu+2FaGRqR782SaUf4Wl7TM+i54puPCDo0b97kZe68crptjpNCuNqhGcVg0DF/mYOjDIANClix84oRtzf41Utm38ctMxHCMQ53t2U314oTMRlruIJjpRXa2FJbKKuqa79jxOy6iz/26LBnIiIVF0RXB34qBMaFxy/YzzR4uHVs2uY5wDZUe/hlViFk+YQlwFWWulU+7HHQ2fBhky85qDvx6PyEKH0F6pk0k/6EuWFY++nC2zoYXtVl3biDN9st3lYPPgNWF63fUv+H/fmI6+TqbDTOCEolBMoKJIn3nK0Rs+kHqKoulkgkhYFxr2OzPNRW1Nf3YhRfUmp2QRdWw17pAeYdiivxAMtO1wtv0UXONTfdK0HjXPXkMRlQiTYTXuzyL/ZwsYhqk++4gLCdgsAjeYI+jQOid99iSkxcNkj/4xZPkaWqnoy2ScJZdakCAcsfnkzASOdcCoKIrsKvvam84nrg1wcKVNYpJL5H4W8t/LJmmiZw3GMdV07E7htCfY+6Ky8Gb71FNrlIQmD72HXtGeC11rbxR7D6lzTTRdo40n2YqglNEEmknElFubpYlUoOhqdwy0cCdHhuZbw98B8eFmF+RLfIsfjGWNVnSFrSg8lSuQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.5
Release Details
UpdatedJuly 17, 2026, 11:08 p.m.
Changelog

Changed

  • Vendor public key baked into the app: AZC2 license verification now uses the production Ed25519 vendor public key by default. Customer servers no longer need AZC_VENDOR_PUBLIC_KEY_B64 for real licenses from SbdLicenseOps to verify. The env var remains an optional override (tests / experiments only).
  • Clearer signature-mismatch warning: the admin license page no longer tells admins to configure AZC_VENDOR_PUBLIC_KEY_B64 as the primary fix.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturewFtcvk8BSgYUH7erpstedDBkV2MaKJZrLLW9Co8vzmPtwMccIiEaPN7rasvZJsq53IjE+mDSK+BzwrueIrN0XnCCvONC0R6ywYLYMBhMxZsZDiZrFYlFVMvcBq0I1h5aGBPsiYO8WYqTBN4DnX/xtsFORpTKJ+IVSDTw/tsTE40N+MIA+aCe0HJb3QZHXziYbxvPSAZIe6dI/v0+Lquii1anvf9k4oF+MfIo8a/7DB7jhY02BQ/8by8JG29AG86oL6wg7IShtR9sZlYD6aI+TBAJ7RZebFuqtta68WyRw8FL5rVy0O8DylWOCNFWundttwkUrL3WE8Mv07Rm+TpJbQ4uc0YdoSOfK2KNhx5VK4zO164z6twBJgusMDQzCoBSfsxtal6Zan8ORNvdh0hA/MI9lYnWX7gpJPdf5FGFoUgc7Oi9ASYC6j0TQE7vUr5kC8A2AoMnjahPykVc5x70NEIW8kboeeC0HjKxg7MNXSaCOJ49+7X7GnXate3cOTBem79vC59a2VvHjefomThLIF9ucnWS9zNXwgfxELPyIsCyKdTjM7Wbg8uD9fMhYZVgDlMLaa6Trj5jPayHMoKMHVY+4Rcd+iTWyGuTqsdyPPZbU/qBJCEhZej9uG1A7U0Pyrd9M+X+uoTxqQlBPFj1Y0blKosk7lPl0Buw2LyKK7s=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.4
Release Details
UpdatedJuly 17, 2026, 10:03 p.m.
Changelog

Changed

  • Kiosk admin UX overhaul: clearer three-step flow (find employee → allow access → assign badge/PIN), richer status labels, confirmations, and actionable error messages (including license/slot limits with a link to License administration).

Fixed

  • Kiosk admin APIs required CSRF again: removed NoCSRFRequired from admin JSON endpoints so state-changing kiosk actions are protected like other admin APIs.
  • Race conditions in kiosk pairing, enrollment, and PIN lockout: exclusive locks around terminal pairing, badge enrollment start/scan, and failed-PIN accounting so concurrent requests cannot double-consume license slots or skip lockout.
  • Badge enrollment only on active terminals: enrollment now requires a paired (active) terminal instead of accepting pending/revoked ones.
  • CSV credential import size limit: imports larger than 1 MB are rejected with a clear error instead of loading unbounded input.
  • Sensitive kiosk responses are not cached: pairing codes and one-time PINs are returned with Cache-Control: no-store.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureRYjKQgR7fhhltR+3iZrWtAevXZtgWOm72Sm9yskWQtXfDgcNiy4umdoCjPrr28t9NW+DASahC11vAFpT65cBVz3/uvuHLPlKtmUTDVb0MYX3FBdOnyYCERerVayRuVBosDJyRSylAsdOoHdvdwVZGzj3P7QTtRXgG3ZvKpg5vTUAvg4H20JknLPzrIRFUslZasnpEcgRpG2WCKLVESXcwdLFG0HTJzrZTwsxAYXd+jT5ciaJD1D3WiMZAjcNEzrPwIxk+KsRJLi1Ni1GVVmFvENUflrdXtUWCLTiixzEs6fsS2U1MrtnJ5ZZxGK9iVH48scHpKiJ4lGiXp48d6wnBuINz7JZ2HIrYQrrFCARNCMKW7j+5Gh4B8w+1UD1t1OtVkrrhgGGPOYToj/+dDHBDNedT+pbAQZx3h2GbjSIVY3cdCD4GRwcwxAjSu5sj0pqmXCPr5l1F8v6ClqmRvOAfFvnP+NC9uO+rZELc0MKPwZBy1ezIgCTiXgVgQk83jyI7Tf4UWSgP4biSpVFSVp/fZwNIetxiauxchKsGMHxuRtQbzCklKylhwf2h1pVuR/XfkxwsxEj3JHeUNXGfH9V85FGjW5P6oKeQaA1lvL9rn8/UhZqNC+LynlwFpUxPwbh5HZkkUsFLFGdPBz/uAmCFnFbErvejTYZZcy7xs0sEag=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.3
Release Details
UpdatedJuly 15, 2026, 10:38 a.m.
Changelog

Added

  • Instance-bound AZC2 licenses: license keys can now carry the Nextcloud instance ID and are rejected when applied on a different instance. The stored license state records the bound instance ID and a fingerprint of the applied key (migration 1033). The admin license page shows the instance ID to include when ordering a license.
  • Daily license maintenance job: a new background job re-applies license limits once a day, so expired licenses or reduced seat/terminal quotas take effect overnight instead of only on the next admin interaction.
  • Signature-verification warning in admin UI: if a stored license cannot be verified with the configured vendor public key, the admin page now shows a clear warning callout explaining the mismatch and how to fix it.

Changed

  • Mobile license gate covers the whole mobile API: previously only clock/break POST endpoints returned HTTP 402 without a valid mobile license; now all /api/* mobile requests are gated (bootstrap, kiosk, and admin endpoints excluded), with an explicit LICENSE_REQUIRED error code for clients.
  • Admin license page overhaul: redesigned layout with seat/terminal usage bars, assignment timestamps, and direct purchase/renewal contact actions.

Fixed

  • Kiosk terminal pairing could leak device slots: creating or activating a terminal now reserves the licensed device slot transactionally — if pairing fails midway, the reserved slot is revoked instead of staying occupied.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureXXtpAkga7MSWT0URLIx8lfJZkYdAp/OPaGbSyuv7lb7HoysNfKpK3Da+GcKbi0J1AdJUsSZJl5Q0Repec5Hc/V3cnykiuQn97n4JtNFKljd2oyjbs7YYvBuqGO6qA+wgATsrWijAI7uvVQwytYa5vwA6+lYkeuLgKZ0jbnnwL9YNvrHzzcu/8JWxMnZXHTQS06IvyIvVlPqYAunMgjnMLj6s9sxg7NOHWE8m2WKh2kHsHVHcVK7G2/zEGkXAt4vg9MOe9p3laDtnjue/eVtpc4ynogL/UX4O+X+ulnF7cJfJCR4FCu0meYwMuujgvJ42uS1DeBlICnV4+dIn4rYhxc8V54BMjlhTyeKCLFMAgs0myKVmfHvOElDCkB1Pu8RJcv8cAzG0FAGzOzwXIzapVAzrokquA4zOwQY7fgMYyFSZAuAxHEfQfkuLeZNPP/jhOPgm09N0NdFwGxOhwVEE1MVg0lFPOj+imT2M8kHKVuEyLV3wRFGbVG0Jjivo0NFEVFDI9x4ibnR3ixHTQhX/+XnRmkujPVF9JAHhRZlr+iuS/mWT4s0IkgdPjFprOi9YQH2zC42lqRpJCLx94EMqcTTFdM3y/rxFfDG/YNJgBr5MJSp6K0Krl/wjoBuNne5gzmjGV1PcaR0IpFgI74dXHU20pXtMvALHtD84HibTgMg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.2
Release Details
UpdatedJuly 11, 2026, 7:40 p.m.
Changelog

Added

  • Pre-migration backup before app updates: new BackupBeforeUpdate repair step runs automatically before schema migrations, plus occ arbeitszeitcheck:upgrade-backup for manual exports. Upgrade backups are catalogued with integrity checks and covered by unit/integration tests.

Fixed

  • Manager "Record time for an employee" failed with "Status is required" (#27): shipped in this build (documented for 1.5.1 but missing from the published tarball). Manager-recorded inserts now set status and audit justification before validation runs.
  • Data loss after disable during Nextcloud upgrade: UninstallRepairFlow now distinguishes disable from explicit removal — tables and settings are preserved on disable (including auto-disable during server upgrades); full cleanup runs only on app removal.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureJPP2H7l2IIixMFE7YJqvF+iaZB8L7+/0QAVjcbHaR+qQmRK/KO8lGTe6Jeiw+L4IMCATnqctysA7LzW/vHlSgVGgfmE4/kpi+zM7tGMvqKv+cmA0cTVJQhBRlw0G7g7keeDLScbID1eAIXXsjRJ1xhpyfUGSFYX53x+3dnHZ0GBdDKCfd1z+yp++QiTz1SQuAqjubLUvDTd/6ZugplY96nr8z6IkpsuzEjgcdkvySyFcoJNCJXWZGFkLlD2P0PEANvVR3dwW9Q2FLaqfgGTiJJ2vyL+BkFsCO8jqH/WOfWhw82HZJ4qprYQP2H5lGt1nCGDhojHhhFBOj5DOhlo435QYSWEdfoldqCj1Nsg2uqunul3xSg4cVX0E+K/IUmXCtIxjlIPthkJaVw0G/EPHBLsQzNeByeSuGGBeUQSbZRiXWEZRn3wglPAzGH0XCzMw3vfcNQrzAKns50WdqzDR2Y4mpPgb+6+IeEWWRz2gPQn4/0FGCVKBX2M41ElLgXGzAMiehCRISCJwQboMBhHf7oq4Jb/tHqEf7OYFz1gGaKBrUArZ4bvHF0cUNPq200s1vN7Cm8jJZaMCQtk5VlEDzuwuwrq3RNqlUaPoBLmISp6lW9UYpkpGjg2257meE+D9H6vd3+0uj/0jP/S1+V59E1+Q635m1D03KZqKYt/Z42w=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.1
Release Details
UpdatedJune 18, 2026, 1:10 p.m.
Changelog

Fixed

  • Update to 1.5.0 threw the whole instance into maintenance mode (#24): the 1.5.0 pro-rata feature added a 9th constructor dependency (VacationProrationService) to VacationAllocationService, but the published build's container factory in Application.php still passed only 8 arguments. During occ upgrade Nextcloud resolves repair steps through the container, which transitively builds VacationAllocationService, so the missing argument raised an ArgumentCountError and aborted the upgrade — leaving the server in maintenance mode until the app was disabled. The factory now passes all 9 dependencies.
  • PHPUnit segfault in full unit suite (~test 583): DashboardDeskletRenderServiceTest instantiated legacy \OCP\Template after hundreds of prior tests, triggering PHP segfault from polluted globals. Template rendering moved to DashboardDeskletWorkspaceRenderer; the unit test mocks it, and a dedicated integration test covers real template output.

Changed

  • Hardened the dependency-injection safety net so this class of upgrade crash cannot ship again. This was the second ArgumentCountError upgrade incident (after 1.4.2); the previous guard only validated the repair-step classes literally listed in info.xml, so a transitive dependency like VacationAllocationService slipped through. The release gate (scripts/check-repair-step-di.php) had an additional latent bug — a namespace path-resolution error meant its argument-count check silently never ran. The gate has been rewritten to:
  • correctly resolve every app class to its source file, and
  • validate the constructor arity of every service registered in Application.php (not just repair steps), using the PHP tokenizer so multi-line factories and promoted constructor properties are handled exactly.
  • Two new automated guards back it up: ServiceContainerDiRegistrationTest (static, reflection-based, every registered service) and ContainerServiceResolutionIntegrationTest, which resolves all registered services through the real Nextcloud container — the exact path that fails during an upgrade.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signatureu5YINc+PuS8hHrWz7yL/oEqD+JdCNSs2Gbuid0nMbFunQitWqgtsSNMPExv2ORm7Ll14LcjREkHyIRc0lv7px2fEXeIAI2rpvSf8NFAoamhuf4v4z/jY+LxxVyjkhhzWlX//Aar6TjUBLD0xk4MjOophqPY+f8ObHyW4SzSWMuElED0glM385ywWWwfVHbY5UWmzGwZ4qAAmshcE0tt2JZrlSAWXFUuTe/FdUKnUXoDVB9ahcBPitdxmF0UFHdX1+4OjSP8fu5m8KoMlM+qcZp9Nr9xxIiBZ9Ew4wnmhDq4cQqMzaBVMgW7gVv6KtehmP4W/3Hhyrtl5tUOB4cxTpnP1vNW0HMNgrNS2h8xsufOz0czSktu7YRstvcW95RWe9wZjH+pDwysBo05YfZPopBIu1eky+tF1jsvyBk9Z+aB6LnRTZ1qbtPZxK7Ce4QHsKzwTjtx7R/So/VUdSH64vkYI27ODmqn7rSjcmwCVbt4NDU7fog+47zmf6yiuML6GwUUQBdnMc5LpDUaKD+p2QdOzvQvU5ShCG0b63sTwHFBcG1KsTrIrQpG4BSF8wth7Uo58YmQHFX3G3Nk5XE02piwmkiySCTyLfTWd7bEu8AUrg71xJtVwrkXkgUmG+a632wfGZMvHHzv4A4r7pnXpIvKRhzmgGaB8Ap7GYxGXyf0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.5.0
Release Details
UpdatedJune 16, 2026, 11:37 a.m.
Changelog

Added

  • Pro-rata vacation for partial employment years (#23): employees who join or leave mid-year now have their annual vacation entitlement reduced to the part of the year actually worked, instead of always receiving the full year's days.
  • New optional employment start date (Eintrittsdatum) and employment end date (Austrittsdatum) per employee under Employees → Edit. Both empty means no proration (full entitlement, unchanged historic behaviour).
  • New global admin setting Pro-rata vacation → Proration method: Full months (Zwölftelung, German default) — 1/12 per calendar month touched by the employment, with a fraction of half a day or more rounded up (BUrlG §5); or Exact days — annual entitlement × covered days ÷ days in year.
  • The admin entitlement preview and the employee-facing "How is my vacation entitlement computed?" explainer both show the reduced figure with a clear note, so the displayed number always matches the usable balance.
  • Proration is recorded in the entitlement trace and historical snapshots for audit purposes.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature04r3eUzf162DBb4dMPJS7sQivJmQuO0es5mnUkPeRArAB+uCEbjQ3bx9btbltRYiJEug5fBGCVSr6kgEdSF+kmTmsk4hsAnISA4gUix6cFj0aIynbPRlYoq4e2W6IORRT6/U6DtM+YWGZxWKc6pe5/3oZEwk6RzRin3ZPcggwNY19vUaT1gHCxewODk73kf0x6FWLjFrHi0r0GZ+ukGlOt3xcPaGqjdxtcSN0QaeskEd8pFJS6QLVeXL2+IYrc46PrqvvV1Sk07ivqJJWeesmj428W2cdcnyKAgBOB6pjkJBCevoV4PoLfmorojPJl2Qpms0/0TiJGyqV+EaExfWRLPxLFwmdPd6hBdT4s36giR75jOdklf/G1alKrcttNnRLzpjYUxyrUElB9DHKZhdKWiJOAHaHvTe2j3OPPF0gFwxCaDhrlDL8Yc6lBmIxwX6Y+Rer9/e1uhnykn5Ww2jIYqeC+ASqsDiOUhYBLKab42v8xlhK60hMMiZNpo3fIwpQ0/LQ/986VlTSPdjsPhjam+W8ONtqMFnAqRqxonAhMxvkOX0p3Rw4CdL21eQJyzeX+XACQEVENRqk3vQD3xev5y1sEFlcXxk75ogpieOfefiiysRWTHR044qYBpmHmjAn1qwwHf5oqo3fpIMZgTbsMzF7ZCluS09QQPXpE3eZsE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.4.2
Release Details
UpdatedJune 12, 2026, 3:45 p.m.
Changelog

Fixed

  • Broken app upgrade (1.3.x → 1.4.x): EnsureArbeitszeitCheckSchema was registered in Application.php with only IDBConnection while the repair step also requires IConfig, causing ArgumentCountError during occ upgrade / web updater and leaving the app stuck on “needs upgrade” with missing navigation routes. All repair steps from info.xml are now explicitly registered in the container; RepairStepDiRegistrationTest and extended UpgradeRepairIntegrationTest guard against recurrence.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureICs/E2o/tBf8TpCMYgReOuPLGeKrhCplYvNCM5kbNkP2HiqQRJpD2qPTc+fu2RgHBDtAdaahVDQfB6VdgqrhRMvFQVzqPTmRdNxjP/TJT6YYGllKwikajxlZVAL/05Duo9AyxWzdsjtM6R4WfUK3WvfMY2Mc7fd1JTmiVpAuX92FujyNmyZSh2NF82R4wU+IZiwK4elYnfxn4At/ebMmLW3wOLh/tfPPSlPGBBjEfmG8XMLf2y3fK+wFG5P2Hfr+NXWSj5xpRmXOF7lVfOFpD3r6/CN+RLy1uN9JWzcnL9SPNCgCTLblCyLDKv475PsGOJl9wXGnP9eFLxpfAAKIY1aspOaaX14XXVWMN4xqyCpKuJbdmalS24vKr85Ln0i1hkad00jLvPcCTOlLRfdogfn0ISYBNd+t8ifSWKEIw0geROiHVpUbGjHlPfizDkqLUw+k5ha0UJfoy826uoE7ewgO11uWR5pQ7y9+nClCrclHi9y6ULf+NYYJlCykzqCMQru4UtbDmmHG8nlBYWQnOo8GqyYhroPkauDbPrdoP36wOrX/xjbnewtttQpYgAHRU8q7I9OJ4Mu8WH0YgUym/AjuKpDkR+74A5HEvwW53X1Bah5660eGr1ZKPjpDdL0sG7UMoNHLzU/Yd/7LSTqqj4Nk4xDa0cEEukq+mVXLvMI=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.4.1
Release Details
UpdatedJune 12, 2026, 2:57 p.m.
Changelog

Fixed

  • Data loss after Nextcloud upgrade: UninstallDropTables preserves tables and settings on disable (pass 1); full cleanup runs only on app removal (pass 2). Fixes auto-disable during server upgrades wiping data when the app is re-enabled.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureiQlJrDXH7/uhJKsNav1Z0nd0WyEEeiwHOpwkEyFOxMEmxO+H7/ivVzHztsP8NJ1REWySBC7mN+WM8LcQxbVYgCY6hBWff6Bbv3BJgQLAkuqUc6onwZ2tAzaiuR/S0HMEPnCQjAcDWc6Jt7zdt6FjWgXQa35VP9/Mpui149Am3qwy5uhqLJeTo5qlKwMELHiG5Xyz+/9kUVgrk2QhfmK56LonLcDRhXIwyoi55nmwizFKFSvJ9zjWVhc3MIl+dXAxg5ZbSLrLmvnoJsDIEJDlh752mlm4Fx8+gX294Kc6WBg/nUIMWggoKJCHZI3pJ45GRxewYJsZs3viwR3k5rxtLwyZu+McnO2wz8RTC5KZdw6svEUpAORNxbnbAuqlJOqbSppJjlGW8jIKopLWwg55vo2hsf3ZaAuhsWy5/afb/b9+TFvlzSJmptWScz4R5sIvdLWnisas7ayRWO4xXi89VrTukwGLzbjXJIhHGp+U61/5uLu4A3PradgnP+qtg2zps927MDjgdEjBYjWw7MXrVds42/rXBRtN2VPnj7ou9cuFJNkFf/GfBaWRU47AxaXlEWz8nUTEfBnQZb0ugRuSRkqtWYMpYVv8A56EyjJABdpLyUjRu7MwSQN1PRBCIiMZMK+9BLeK4sgTzS2FOLtue76A9jbqUafuiNnGAsdd+nI=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.6.0
ArbeitszeitCheck 1.3.24
Release Details
UpdatedJune 4, 2026, 12:41 p.m.
Changelog

Fixed

  • Dashboard widget: DashboardDeskletRenderService now uses \OCP\Template instead of the non-existent OCP\ITemplateManager, fixing Could not load lazy dashboard widget: EmployeeStatusWidget on the Nextcloud home dashboard.
  • Callout partial: alert-callout.php defaults $calloutHint to an empty string so includes without a hint no longer emit PHP notices on the main app pages.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureHbMR9UYH9j0V1gE6aOqBkwUMuN6o6kdufKydH4mwQE3Kkl4OsIunVe3qBvy0qHcQgKMU2VI87UawAcuL5FjsiHj8cqZfuFNSmlMVIb/ipKM1xxLZ5I9jBcadE/Xf4FJa4c8oQgfgQGAT9liys3fevhk/Vh04pyRC/A+rWv79OlT0TWyCZVSP05rbYDgve92qBlJIGWk9BRKlaTJ2C6mWD1zyuJjEi7DVrO03VN9MVVxHw7nhFJrFNitX6xrY9hWTtanmxDYNO7xtqtDPsElNxLWFZgUdRGhim3W0FdVQMii6mhOsKbj4hFwB7pk1IDjq9FRYHrgAllU24eAb7yVhMj9zRvBhuLIgYDReXWnHBZ9bjz+TT5np/Ru294OsSl7dp6Xoci7uN2HajMxJ9GzMRBxMqEfKfiXFLLD/yEk0Qx+1PLr985Y764Fssoa6I1bGrmTo04/+Qt1AC8LG5KkmeZfK4MA6awsOT45OKqkFQ6rihpobJvIReD4alazxjk/ova4+xBSJnu/+jO4yWyVlL56AleYdr1a7E4WGEAP9nzLWFX/BzFaQXY07vFjFgvHljXp0ByVsy8ceIjzZ76JyvkbrPC35P9qv3D8O4PrkyhP8lRik0KnJ5kajw5e/p9QqC9t0musDmpKLqpyh9UbPVhZJWE4bfp1RMenzh8mlktA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.23
Release Details
UpdatedJune 4, 2026, 9:10 a.m.
Changelog

Fixed

  • Install and upgrade path hardened. appinfo/info.xml now declares MySQL/PostgreSQL under <dependencies> (required by MigrationService for correct schema checks). EnsureArbeitszeitCheckSchema runs on install and before every post-migration repair chain so missing tables are recreated and failures surface in occ upgrade logs instead of a half-updated app with no UI feedback. Schema checks use the active table set only (legacy at_absence_calendar was dropped in migration 1012 and must not block upgrades). Repair steps use OC\DB\Connection for MigrationService, matching core occ upgrade.
  • Post-migration repair DI. ReleaseStuckPendingAbsences is registered in Application.php with AbsenceService (same as BackfillAbsenceDays + HolidayService) so occ upgrade never instantiates repair steps with wrong constructor arguments after partial deploys.
  • Admin schema banner. All admin pages show a critical callout when tables are missing, with pluralized guidance to run occ upgrade and deploy the full app bundle.
  • Onboarding API no longer fakes success when the database is incomplete — returns SCHEMA_NOT_READY (503) with a clear message instead of “will be saved after database migration”.
  • Health endpoint reports incomplete schema (missing table count) before the generic connection check.

Added

  • SchemaHealth, EnsureArbeitszeitCheckSchemaTest, and extended UpgradeRepairIntegrationTest for the production upgrade container path.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureqTDcyBckDVqDxwWcqy6hLGMqmhVWsDm5t5ByJta0x1UHMYhEgratJP60v/Qfpb7eExVk7ZbMArGlodQIgRQrWFFVbHPPwnaPscmBHMmoM5VqlXwtkKIbbgmfqxqV5lLkPA1nrEiBJOYUUgxG2tuMp9BHWdA3f2XsoQ2x/UKlSwu1+82ax6sHc8EvQWr+eUnmtKR7IjkTuaYJEHnaHgN3uN6XioPtJMiX1OL/bfkeiAT9sD5bK7bTaL83nCuzTejGFWYg2SSz4tElLPDe848g9xhlsgg1jwIFzz5HKrtVNq+EkhQru62HCjzejRGLN6l7+Z6hGhkHlXhGAckAnI7v1i85l9DJ092+2SLTMQ1vg5o1iW8x4JRn0/6RmePqQCV8WElog/FkTl4BlNA8CKjgzUo301AEjKqKtOt8b/uKlvQmx65vla3G9SEZ88MUbwH9jaNcTVKeubVokBAs278qDncfNR6Jkz1L4dK6v9haFNx37dSy4g6Hnavwr6znnDEK0P38j9fzuxjfqefzeeHPwe7jHQP/I0pwJvpsMML265HLTUPHlnxh5hHXXp86zv9fjY4TBk26AzyQ/uPvYD1GZ9XLruw31Ua8276G+qbmNsNY/2ntydR3Gi9PSWDBNAOGddHRrGUc8UPpbnlMdqWCtGDEAg/vlEpQ1dOvDqr/MJw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.21
Release Details
UpdatedJune 3, 2026, 10:12 p.m.
Changelog

Added

  • Organisation-wide time recording methods (#16): Administrators can disable clock in/out (stamping) and/or manual time entries for everyone under Admin → Global settings → Time recording methods. Per-employee restrictions remain under Admin → Employees → Edit → Time recording. Organisation rules are enforced on every API path (clock, manual entries, dashboard, mobile bootstrap, desklet). Missing clock-in reminders are suppressed when stamping is off. Audit log shows a dedicated label for organisation changes; integration and E2E tests cover org-vs-employee layering and API enforcement.

Fixed

  • Nextcloud Administration settings panel: organisation time capture checkboxes now load persisted values (previously always showed both methods enabled).
  • Employee time capture validation: disabling both methods is rejected before persistence (HTTP 400, not 500).
  • Admin settings status badge: uses shared WCAG-AA .azc-badge variants instead of low-contrast solid fills.

Unreleased

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturexwZuRuE7q6Pvz49TbD4EbtW+5pAzncGRYelTeZOhoBETF8Gytm0lR3DWP2Bl9edR5m6fpo8FNav8LM0lL1eg+2DlvSQ1RCKxuFANOAjTdgc/sAJVnSEHPKz7Mh5jl5T7wxz243YjN9CdzsekXTxKs8wSMqHkbQX3/SUzT5vvlwzGXJCh0Ir6zzgq5RGY1rSOL8tfvKFSvAWnKEFi53mE0xqjpyStT6399Q4e4pVmJbmvWDG7uzjb99JtVWrEhT8BWK8O9y6Ynho7sXNiim+rEi3D9ZrqoKSC/CSv+kyYr97j9V8/W0EhMAp6RYyD5zbuEykyPmKSKvEq0dfgu6tpTTbLFatHfKSqExkulaJd1p0CPmpzwB5gbU9o8/a+yuJkNxfGp1KJTbmmALLHuyiiv1kxwrDiCpHYf1FDOrAVofXIX2ADeuVtS8oQOCZ3rh02IuuEIa4IMEGRyWA3gQBdfhzhG0aBSNIo/RFd87wL3jvcE+NiuLVRAYBMlX2OwryoF831KKMnu1ja+l+tSx5yx5srhAO8LI/0zJo3c0AtdzlbDIpOwSEDa8CqepZuK7bk7S0O5fW+G4KilO4ZXZubGD5TKK3ZUkMD1kvtWEotPyxHp8aJd805RxyxYGl2YGGmKjnGOitob1O+V8bl/phnThtasczeE+saiOoqXVeeVd8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.20
Release Details
UpdatedJune 3, 2026, 9:31 p.m.
Changelog

Fixed

  • Callouts and notification icons (all Nextcloud themes): unified templates/common/alert-callout.php and css/common/notification-surfaces.css with theme-safe panel tints and semantic icon wells (same contrast model as the page header). Replaced invisible Lucide h.01 SVG marks in IconCatalog with visible accent dots; added IconCatalog::renderCalloutWell() and variant classes (azc-notif-icon-well--warning, etc.) so warning/danger/info glyphs stay identifiable on light, dark, high-contrast, and custom themes. Admin notifications save feedback uses matching callout styling and role="alert" on errors.

  • Admin → Teams: member/manager picker now finds people by name (#14): the people picker searched the directory by user id only (IUserManager::search()), so on instances where the user id is an email, employee number or UUID, typing a person's name returned nothing — most of the directory was effectively hidden. All admin/manager people search now matches user id OR display name (shared UserDirectorySearch helper) across Teams, the Employees list, the company-status dashboard, the manager month-PDF picker and the scoped-employee picker. The Teams picker additionally excludes already-assigned members/managers server-side (exclude[]) so a large unit can no longer fill the capped result page with people already on the team, and shows a clear "Showing the first N matches — keep typing to narrow it down" hint (announced to screen readers) when more matches exist.

  • Admin → Employees and time-entry tables: inflexible width / clipped actions (#12): table-heavy pages now use the wide shell (time-entries, absences, manager lists, compliance lists); .table-container scrolls horizontally only when columns need more space; action columns use min-width: max-content so Edit/History buttons stay fully visible on desktop; mobile keeps card reflow (azc-table--responsive + data-label). Manager scope pages no longer cap list width at 56rem. Playwright regression: tests/e2e/table-width-desktop.spec.js.
  • Admin → Holidays: auto-restore now respected when deleting statutory holidays (#17): deleting a statutory holiday while Auto-restore is disabled records a per-(state, date) suppression (at_holiday_suppress) so the day stays removed in both the admin list and the calendar after a reload; re-enabling auto-restore revives the day and clears the stale suppression. The admin list and the working-day calendar now read from the same DB-backed source, so they can no longer diverge.
  • Admin → Holidays: "Default federal state" select is now functional: the control on the Holidays page was rendered but never wired up — choosing a state did nothing. It now persists the organisation default state immediately (with disabled/aria-busy state, success/error feedback, and rollback on failure) via the existing admin settings API.
  • Admin → Holidays: statutory holidays are forced to full-day: saving a statutory holiday now always stores kind=full (the working-day engine already treats statutory days as full-day), so the table badge can no longer claim "half-day" for a day that is counted as full.
  • Admin → Holidays: honest delete feedback: removing a statutory holiday while auto-restore is enabled now states the day will be added back automatically, instead of a misleading "Holiday was removed" message.
  • Sachsen-Anhalt statutory holidays (#13): GermanStatutoryHolidayCatalog seeds Epiphany (6 Jan) and Reformation Day for ST while excluding Corpus Christi and All Saints; auto-restore prunes legacy generated rows that used nationwide rules. occ arbeitszeitcheck:holidays:verify now reads the DB without reconciling first and fails when extra statutory rows remain (not only when catalog dates are missing).
  • Admin → Employees: entitlement preview UX: human-readable summary line for HR; full calculationTrace JSON only inside a collapsible Technical details (audit) block (WCAG-friendly, no raw dump in the main form).
  • Unified date format for Stichtag: overtime tracking start date uses the same dd.mm.yyyy datepicker as assignment validity dates (admin edit dialog and Nextcloud “New account” panel); values are converted to ISO before save.

  • Admin → Employees: overtime Stichtag / opening balance not saved: UserOvertimeSettingsService passed the Nextcloud user id (string) as the audit log entityId (must be ?int), causing a TypeError on every Stichtag or Eröffnungssaldo write — with the atomic profile save this rolled back the whole transaction and surfaced as “Benutzer konnte nicht aktualisiert werden”. Audit entries now use null entity id (same pattern as time-capture settings).

  • Admin user pickers (Teams, month reopen, overtime audit, vacation simulator): replaced the old 50-user dropdown cap with a searchable combobox (GET /api/admin/users?picker=1), minimum 2-character search, enabled accounts only, and shared WCAG-friendly styling. Legacy GET /api/admin/vacation-layers/users delegates to the same picker API.
  • Admin → Employees list: browse all accounts with Previous / Next pagination (50 per page) and honest search feedback; empty search no longer hides employees beyond the first page.
  • Manager employee filters (time entries, absences, record-absence form): replaced large <select> lists with the shared searchable combobox scoped to the manager’s team (GET /api/manager/scoped-employees); admins search the directory, managers only see their team.
  • Admin company-status dashboard widget: status totals now scan up to 500 enabled accounts (was 200) and note when the directory is larger, with a link hint to Employees for the full list.
  • Admin → Employees: server validation errors from the atomic profile save are now mapped to the matching form fields (instead of only a generic toast), with focus moved to the first invalid control.

Changed

  • Admin → Employees: clearer “Find an employee” search with help text; pagination status shows ranges (1–50 of 150) or match counts when searching.
  • Admin → Employees (edit dialog load): vacation policy for future-dated work-schedule assignments is resolved as of the assignment start date, not only “today”, so opening and saving no longer mis-defaults to “inherit” and triggers a failed save.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturegeMFAGBU3RbCnVfsYVqpdfDm4WygcEkjnK5Jg1u6auf+NCYR/TDRWQVnuh+wVsyVpJHmw58G2oUPy/D+eTh+pEwzUVeut23+vPhW00jAoHHxXVkTSGXuAZlG9f1cRR0KDc4ClcsgiECSSvpauVs2Nuq2dlkrg39wf1WIRpuEXagIRoErKmz/AOJEJNWN3j2j4Vp69EMtlDZSgMovnGJ28H6wKDmjQFrmWO0e4g1UoAGSmxAcQE+agRKQjoefMiqws2AZh9uPrJSZQK4hW+L8X0sGp/yOtlmebo7PAzMC9KphJnKlsmf74d88G5tZfjwmGlb0Ptu0XicNNPizPQNBZo2ohQYIsSx4ZWWFRf4O9o4JDrHP6sOpOZWbmr/DJp9wQ5brkcYdiP2dzYaSvj623iYO2Vndyqn6OgMmCNjeFS0Ksz0aFwo93XukZtqtjGAH8yeuV+xee09dQy57lG+9rK4lR+gjkxE9G1u8z0mSWr16ysMdJVq1brmE896xqL+kaQ+jZ3eW5OiqfUDp97nzwAmq7DbTaSMO13hrTuPbI9aNwvCMsmIyz4U1L3bifavS0+VgJoRu1glxBdH+lL9K59q+t6aFF8a9UDbYDgvfnm4Kj6RnGSKKeHSycUw7slHb9U9cM8sgKcR3HE8EIuJMdm6KTri+edRup7EOJDU/M94=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.10
Release Details
UpdatedMay 30, 2026, 6:12 a.m.
Changelog

Fixed

  • Calendar day details panel (#11): side drawer sits below the Nextcloud header (close control no longer hidden under the profile menu); calendar and app navigation stay visible while the panel is open; switch days without closing; close via X, Escape, or click outside; live header offset via syncAzcOverlayMetrics(); Vitest coverage in js/calendar-day-panel.test.js.

Changed

  • Overlay tokens (--azc-overlay-top / --azc-overlay-height) shared for fixed panels and mobile nav; theme-safe dashboard callouts (WCAG 2.1 AA contrast on all Nextcloud themes).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturepKOZDEKgte4hRCu2ujFlEugriqikEtGVDOTn//KioVz1qzKO4EWSK4sAzG4fpacAYckdh+cAV7mPbCu/4e/NSD6SqSJ6R3q4N1iiW1952XV4pJsKIF7UrYysYrUtYj+qt9MjQL99ehcqNa4/Gd0qf9wLjO9n6/U5n5ySx+trjwJwxdsfKIuHxTlhzKYkXx6jqZPHG5i3uHH4RYBfCZ9iT35aPKrYJlrSmVVxlFlh6yelwOkDHk0aWJIPtQku/FUW5zLW67k72BAswov1DpOvfkM5QOJQPdKjwhZB+lElosw+SWqCyNffGJYuWUzQVxGAFTEqQgQ9wQx5QFf4PQsr5ExKYeMm4RbpJph2UTqcpGiVInjCFi2vFZs1En2XpHKC/DaSwNNohsJI2pDcwoeohO0GeJSQ8WAOAgsdwLzXGd4PriQZL2u8t+TqMxeQfDZIVymN6jwdIaJPGc1Jvvi8SOFsEagVG/YpvJ0FNR+tBr7cwt4GSaqD05jcldAb9CSkfR9ZlEzGY6wcT3b6Mez/wnzvjs4bytzhW25xtlzBVc6vkkQUQsrCeBPOKe+g29SXIxIXmrmBCWiuxnhydg6XddXQMTZbCVYmMOcgSn7VtR1gs/FAifzsSKh09E6TypRMM3a9XFXMln2N7Sm/QRsh+6SJwF/zq2f+JX6cyv3L7w0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.9
Release Details
UpdatedMay 25, 2026, 8 p.m.
Changelog

Added

  • Unified layout system: css/common/page-patterns.css with .azc-page-stack, .azc-shell--wide / --minimal, shared filter grid, empty/loading states; shellWidth on page shell (auto-wide for dashboards, admin tables, manager lists).
  • Shared filter panel partials (templates/common/azc-filter-panel.php) and admin app teams callouts when use_app_teams is off.
  • Dialog API: ArbeitszeitCheckComponents.openDialog(); modals use inert on nav/main instead of aria-hidden on #app-content (live regions stay available).
  • AzcApi.isApiSuccess() for consistent JSON success checks.
  • E2E: tests/e2e/layout-smoke.spec.js, tests/e2e/a11y-smoke.spec.js (@axe-core/playwright, WCAG 2.1 AA tags).

Changed

  • All routed pages wrapped in .azc-page-stack; legacy .section chrome reset inside the app shell; .btn aliases to .azc-btn styling under #app-content.azc-app.
  • Admin teams page uses full page shell (buildAdminShellParams); navigation exposes a single skip link to app nav (main content skip remains in page-start).
  • Personal settings (Nextcloud user settings) and SettingsController load assets via FrontEndAssetService::registerCore() only.
  • tests/WORKFLOW_ROLE_MATRIX.md: manager role requires app teams; /reports is manager/admin only.

Fixed

  • Admin users page: pagination label uses {shown} / {total} placeholders and TemplateL10n for JS export — fixes Internal Server Error from json_encode($l->t('Showing %d of %d employees')) without vsprintf arguments.
  • Employee absence request form: azc-card layout, visible page title, workflow callouts (auto-approve vs manager/substitute path), fieldsets for request details and substitute (fixes duplicate “Substitute” label), side-by-side dates, clearer optional/required labels, azc-btn actions.
  • Time entry create/edit form: page shell + assets via TimeEntryController; timezone and approval callouts; azc-card with fieldsets (date/time, breaks, note); aligned break matrix labels; dynamic breaks match PHP a11y; responsive fieldset layout (WCAG 2.1 AA).
  • Absence create/edit/view routes: AbsenceController now uses PageShellTrait + form assets (same gap as time-entry create had — broken nav/header without shell); errors render on the list page with a visible callout instead of a blank layout.
  • Time entry edit errors: denied or failed edits show the list layout with shell, assets, and an error callout (no half-rendered page).
  • Navigation flags: centralized in NavigationFlagsService + NavigationFlagsTrait (all page controllers including Manager, Substitute, Compliance) — removes duplicated getNavigationFlags() implementations; compliance pages use forComplianceUser() (substitution nav hidden).
  • Absences list filter: legacy .section filter replaced with azc-card / azc-filter-grid (matches time entries list UX).
  • API compliance gate: blockingIssuesForCompletedEntry() + pre-save check in apiStore / update / store — ArbZG §4 break rules always block invalid manual entries server-side (strict mode adds further checks without writing violations before persist).
  • Calendar absence indicators: month/week cells show readable chips (type label + approval status + tinted icon), not icon-only strokes; week view shows absences; day panel lists status; legend explains approved vs pending; forced-colors and theme-safe contrast.
  • Manager month-closure PDF page: refactored to azc-card step wizard (numbered steps, person rows with azc-btn downloads, standard-width shell); removed narrow floating column layout.
  • Manager absences & time entries: legacy .section / .btn layout replaced with azc-page-stack, azc-card filter/results blocks, shared azc-filter-grid, standard-width centered shell (like month-closures), and azc-empty-state / azc-btn patterns.
  • Manager dashboard: migrated from legacy .section blocks (broken by shell section reset) to azc-card sections, admin-style stat tiles, standard-width centered layout, and azc-btn export action.
  • Admin holidays: refactored to azc-card layout, shared azc-filter-grid toolbar, table-container / table--hover, scoped CSS under azc-app--admin-holidays, and azc-btn row actions (fixes broken .admin-holidays-page selectors).
  • Admin vacation layers: azc-page-stack + azc-card sections (intro, L0/L1/L2, simulator), table-container / table--hover, scoped layout under azc-app--admin-vacation-layers (removes duplicate page padding and standalone .layer-card chrome), azc-btn / azc-badge throughout.
  • Employee time entries (list): timezone callout, stats, month closure, filter panel, and entries table use azc-card / azc-callout / azc-filter-grid; toolbar buttons relocate to the page header; scoped layout under azc-app--time-entries (fixes double margins from legacy .section / .stats-grid).
  • Dashboard overtime balance: negative and positive balances use main text on tinted pills instead of raw --color-error / --color-success, so large values stay readable in all Nextcloud themes (WCAG contrast).
  • Unified data tables: page-patterns.css defines one table system under #app-content.azc-app (.table-container + .table.table--hover, action columns, empty/loading cells); all routed list templates and dynamic report/admin tables migrated off legacy table-responsive / bare grid-table; TableConventionTest guards the convention.
  • Manager absences & time entries: filters moved into the list card as a flat toolbar directly above the table (no nested box or azc-filter-panel accent); dedicated filter grid alignment (no subgrid glitches); “Record approved absence” sits below the list.
  • Audit pass (workflows / a11y / security): l10n for app-teams callouts (en/de); admin teams full shell; working time model delete fail-closed typed DELETE; calendar day panel inert + focus trap + Escape; admin settings azc-callout errors; manager dashboard error path includes team-mode URLs.
  • Breadcrumb trail: simplified shell markup (no separator <li> nodes) and scoped styles so the trail reads as one line — primary link, muted section, bold current page — with CSS / dividers and ellipsis on long titles.
  • Compliance dashboard cards: migrated status and violations blocks to azc-card header/body layout (title + help left, actions right, sized button icons); removed broken card-header--with-actions stacking.
  • Admin dashboard layout: fixed styles targeting wrong .admin-dashboard class (shell uses azc-app--admin-dashboard); removed extra .section padding; azc-callout warning banner; stat cards grid; issues block in azc-card.
  • Confirm dialog typed phrase (client): if the translated label still contains %s after t() (e.g. test stubs or missing substitution), the requested phrase (DELETE, REMOVE, …) is applied so destructive prompts never show a raw placeholder.
  • GDPR delete UX: when confirmDialog is unavailable, settings now surfaces an assertive error instead of failing silently; confirmation results use shared isConfirmAccepted / confirmDialogReason helpers.
  • Fail-closed destructive confirms: Utils.confirmDestructiveAction() blocks month finalization, month reopen, correction withdraw, and overtime payout (single/bulk) when the dialog API is missing or the user cancels — no silent proceed (audit-critical). All admin delete paths (holidays, teams, vacation layers, tariff retire) now use the same helper.
  • Month closure lock notice (W7): shared templates/common/month-closure-lock.php with lock icon; shown on time entries when the selected month is finalized.
  • Settings UX: sections use azc-card spacing and azc-btn controls for clearer visual hierarchy (WCAG-friendly grouping unchanged).
  • Substitution requests page: removed duplicate <h1> and orphan </div> (invalid HTML); styles now target .azc-app--substitution-requests so the shell layout applies; empty state uses azc-empty-state pattern.
  • Dashboard clock double-submit (W11): setLoadingState() sets aria-busy="true" on clock/break buttons while API calls are in flight (with disabled state and loading label).
  • Reports DATEV discoverability (W23): administrators see help text under file format pointing to Global settings → Exports and reporting (CSV/JSON remain on this page).
  • Admin notifications (W13): sticky save footer, beforeunload when the form has unsaved changes, and aria-busy on save while the request is in flight.
  • E2E vacation seed (ensure-e2e-vacation): UserVacationPolicyAssignment no longer pre-initialises vacation_mode, so INSERT always persists the column (fixes SQL 1364 on strict MariaDB).
  • Clock status API (ArbZG calendar-day): at_daily_maximum and session_hours_on_calendar_today are now always returned (including when clocked out) so clients can block clock-in without an active session; overnight E2E asserts the contract when daily max is reached.
  • E2E clock seed (ensure-e2e-clock): dev/CI-only OCC command for e2e_* users clears active sessions and backdates the last completed entry when ArbZG §5 rest would block Playwright clock-in; wired into run-e2e-docker.sh.

Added

  • Vitest: js/common/components.test.js (focus trap / aria-hidden / typed-confirm label) and isConfirmAccepted coverage in utils.test.js.

Fixed

  • Production-grade audit hardening pass (UX-parity follow-up):
  • Manager dashboard (js/manager-dashboard.js): fixed an unbalanced paren on the team-overtime “Payout eligible: %s h” line that prevented the file from parsing, hiding the entire team status panel.
  • Admin users (js/admin-users.js): the two opening-balance year validation messages were calling an undefined t() helper; they now use the page-local auMsg() so the German/English text is announced correctly via the messaging live region.
  • Icon catalog (js/common/catalog.js): removed a duplicate calendar-off entry that produced silent overrides on load.
  • Confirm dialog typed phrase (js/common/components.js): when callers passed a non-default typedConfirmPhrase (e.g. REMOVE), the label still said Type DELETE to confirm because the translation already substituted %s. The label is now resolved with the requested phrase so destructive prompts are honest.
  • Stylesheets: replaced the deprecated clip: rect(...) screen-reader pattern with clip-path: inset(50%) in css/app.css and css/manager-time-entries.css; reordered border-color before border-left-color on .inline-notice--warning/--info so the longhand override actually wins; replaced two empty /* */ block comments that tripped stylelint.
  • GDPR data deletion now persists the user-supplied reason: GdprController::delete() reads the reason parameter posted by the destructive confirm dialog (js/settings.js already sent it), trims/clamps it to 500 chars, and writes it into the gdpr_data_deletion_request audit log entry alongside the existing IP/user-agent stamp. Retention-period enforcement is unchanged.
  • Tariff rule sets now produce a complete audit trail: AdminController::createTariffRuleSet/updateTariffRuleSet/activateTariffRuleSet/retireTariffRuleSet/deleteTariffRuleSet each write a structured tariff_rule_set_* entry with old/new snapshots (code, version, jurisdiction, status, activation mode, validity window, module list). Previously these admin mutations went through unnoticed.
  • Admin authorization now returns JSON for API/AJAX callers: AppAdminMiddleware no longer serves an HTML 403 page when an unauthorized admin endpoint is hit via fetch/XHR or /api/... URLs. AJAX consumers now receive { ok: false, error: { code: 'admin_required' } } with HTTP 403, while browser page loads still get the standard core/403 template. Defensive guards keep the path safe under CLI/test runners. Covered by AppAdminMiddlewareTest (HTML, /api/ path, XMLHttpRequest header) and AppAdminAuthorizationIntegrationTest.
  • Single source of truth for front-end assets: removed the duplicate CSS/JS list from Application::boot() — every page entry point now goes through FrontEndAssetService::register{Core,Page}(), including app-vanilla.css which is now imported by css/app.css. This eliminates load-order surprises and silent drift between the bootstrap loader and the central asset bundle.

  • Night / overnight shifts (Wachdienst): ArbZG §3 daily maximum and automatic clock-out now use a single DailyWorkingHoursCalculator (calendar-day clipping at midnight). All enforcement paths aligned: live sessions, clock-in, compliance checks, manual entries, automatic breaks, break reminders. Fixes false auto clock-out shortly after midnight. Frontend auto clock-out only when at_daily_maximum is true (never client extrapolation alone). User stats and manager week/month totals now use getWorkingHoursForPeriod() (same calculator). Compliance “excessive working hours” violations now use findAllCalendarDaysExceedingMaximum() (no false positives on legal 22:00–08:00 rows). Audit reference: docs/DAILY-HOURS-AUDIT.md. E2E: tests/e2e/overnight-daily-maximum.spec.js.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature2C4hs5Nkh/isdBTEdvZY3ot9kpByYyhztPuFF1szdNDnGW2VL4wnIo2CTjNogi5kdF8hsOuunKu+l2j9gqbb3Rg0dIUKN0pg+LGN/0k0PmHqPko7R6Qbau/bfqFPBZXBx9g/nVQ1IG+3Nm71r/V8LBBFA2cHD3SpRz4A+98ah+3Y3K62zKc+oa0SnqWQUB/97WR4rGNf8oatUerQl4iPg68AdIavnH5tZerU3up1gVNbwjyMSomopWbJvyBsSemhauUGAEx6tw4dbM8KZ1QkVHWzm/RD0s4gM8B+OE2ZOuThKkVc36TNbFNwwPJc/hzbS7P3RHfjaecHUODJiPAFhGFquhb/pvMmzReC6HoTrQLYg82VDOZmcvCjsMWvKPPu345ouqeif8MtJe0lJlTLXxvPxOFMbqLIthiZ1bbxUdiceLQ08JabJ0fxxCObBPilimywPUetparMm2am6+3Rrkbyme+Z5XhuDiscczNIAoO23aoFMY2UsJBH1GpuNgTKB5MG/r9ygKHn2Hsec0m/ziwqEuYvFcGzoZsUYH5uZeeVh5RzulicF36k88Tb/i8zIlrYyjU+w6xixr4Vg12lFQW6jIyPrdmnF1wNFTjaZOU9SBjR5EjrgNoow6ld5ncVdopMLH5Jrrmm9ts3oSV4IEbcEztxrjcMV9aTCbbwGrk=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.8
Release Details
UpdatedMay 20, 2026, 2:54 p.m.
Changelog

Fixed

  • New account + overtime tracking start date: the start date is captured reliably when clicking Create (no longer bound to the wrong dialog); the OCS hook runs only for POST …/cloud/users without sub-paths (LoadUsersSettingsArbeitszeitListener).
  • Manager correction: data-entry-summary is emitted like PHP with JSON hex-encoding; display times (displayStartTime / displayBreaks); empty clock values show -- instead of misleading 00:00.
  • Overtime: a future tracking start date no longer produces a fictitious negative balance in the current period.
  • Opening balance year: server validates exactly four digits (2000–2100); client validates before save (OpeningBalanceYearValidator).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureZ0q4sUnNdtEyv8lxCK1Rm/0xEeKazqwJeSURzbpe1ZgbL09P25KESZpPKZH0ynjwPzFPIkQO8wLTSZSXRs/9/M5I2jnuSZkzBBEZI/Lzfy1O9MK75v0aK+v8kItGR+o+pkb6zXEyxTeVhOsvXqDBeBG4oY32ODpRiOONCrJ3AXU0a+ZSnSCGWF1aU6oBwXl84Go+sq+t+ftXxzCjpmpBLfHqP/3in8oVTM/OkTJv+noOYUKeNDz33sQes1Iw+aufs+vOUdEQqLV2jI8Kxcl5E7uwCMO3ChguaIdqeiDN692nF7lF9Kr5BVS9HmueOXwVQPGxOINSTcYNtSPrCcXbHfuWgUBZxSXejwsQOix0FsIIWgu/6j7ajNeZ7bQpt6hOtpC/Bdkk6SOELcG/0wumofrGUYUSRGFYzxV986X+npvdukna/1rIp5+wuN6mft+g37N31iEdfH6lf1B0VLkVSoX3nhkNq/O5suuRRMnN4GgRmduGU44FtrRSVv7wlOJevgwEOuWbkEryrbnkHL821YhIsop/8+WX5H9ZBDu3IcSLc2FFv9fAfpIa3UnKTXvjAvC2Qiuo1kb8t1q5q69tYTYX9HsS4Zd9/JvKn6ICtwvfFuFpDLCyTWC0pczjkV2NWQaxkp2RC9X5Qsl5U6CZUQqnB59cGOxOyV6d2Q79hOg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.7
Release Details
UpdatedMay 20, 2026, 7:44 a.m.
Changelog

Fixed

  • App enable / migration on Oracle-compatible Nextcloud installs where physical table names must stay within the 30-character limit (dbtableprefix + logical name). The overtime opening-balance table is now at_user_ot_year_bal (migration 1025), and migration 1026 renames the legacy at_user_overtime_year_balance table in place on instances that already created it, including PostgreSQL sequence cleanup. No data is copied or dropped except dropping an empty stray target table left by a failed prior attempt (same safety model as ProjectCheck table renames).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureB7PdTU3mqJ/98cpYZ0TnDGDCx+oZCtqWFxHCQic9SB4UoVrwJa59UptjIY/ZxA5T9SiPtcSl2E6sAnoGQWzdbM3wLfnmUu3TA36AjK5xtrBOV3z8VNJeNdVHhay0EYnFXFZpTx2JzYMQH8zW0JgZey7olRodmWcqj9jcjgaqyWeERYkBYiAtgPaMrfR0++JHqTCCT+xHJZc+H8FPL8SeKUEwsNq+hnpCD8UH30XTdvDhLQ+ZV1GXdsfpd5/RsLtR3tTk9TTCIsT7SlU97g8js2DwWHOO9w7bCDWlh+gMm33IcNqrEZQtAn+nT3uWK8haxVCPlaB5kyJJm+kMP9OfvoN1H0dEiioN4muHr5pHgTGR+KaGjPKeJ47epzRD6cvRSsjwrcQVlKlQcCTXWdBf2N4ERAqnr23/jAxuto6xYTToRq1evOLLgMhkq/4zFP/uB8h5dnqKXiOg3HwNQBW2EmnLWxiTG9uSkfCbKsupQ+YPGOwK8Xj/mtU/HmsWecl8izqjcTHSkTm0tO7ehN+8ME2LSzTUrnIYyLcpkaJqkOouFFAEBG/ZNXonDjiu33oVWjOrsJdWq5Wr7vYlI1B8TxKI+ovgfdgLqn72Hb50xYgnVfSjX93zW3cwXEX82yeu+KL90OcGtJCSMsLlQd6hq48Q2KXHMdHml78r7bgWmO0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.6
Release Details
UpdatedMay 19, 2026, 4:17 p.m.
Changelog

Added

  • Manager employee time entries & absences — accessible filter bar (templates/manager-time-entries.php, manager-absences.php, css/manager-time-entries.css, js/manager-time-entries.js, js/manager-absences.js): two-row CSS grid with aligned labels/controls, WCAG 2.1 AA patterns (fieldset, aria-live errors, visually hidden sublabels), client-side date validation, and a 365-day maximum range enforced in the browser and on list APIs (ManagerController).
  • Manager direct correction dialog on employee time entries (js/manager-correction-dialog.js, js/common/time-entry-clock-form.js, lib/Support/TimeEntryClockPayloadBuilder.php, shared correction l10n partial): European date + clock matrix, optional breaks, server-side payload builder with unit tests.
  • TemplateL10n + templates/common/manager-employee-list-l10n.php: safe server-side JS translations (single json_encode of plain strings) — fixes Internal Server Error from json_encode($l->t('…%d…')) without vsprintf arguments on manager list pages.

Fixed

  • Employee time entries page crash (ValueError in L10NString / vsprintf) when loading manager list l10n; %d strings are now translated with explicit parameters before JSON output.
  • Compliance violations filter/export UX and admin dashboard overtime onboarding tweaks included in this release train.

Changed

  • User manual (docs/User-Manual.en.md, docs/User-Manual.de.md) updated for manager list filters and correction workflow.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature0Ac+p2TednXZOZygWTS03vqEgTpCHvYmjHTVXsUhKOnCwFQQS6qZS5ss2QJ1tfJHH/17mGB+b54zhzIC69ZSn1ka8V97iYTAyoY0I9iQCla2zAlV5JlieuIJ2vjDbzJxetzUvrFsdPibiR6Ug5lq5roWpWMLASNeJ5PKFkKGXQmmRRt2xVYg3XbTB6ScDFGtAjLgIi9/zLGICX/CQl3wi0GEXewNpHnZaN5yVNL6R3h3Ez1wYUhXosUUQRtPKfEGD/ot+lwQGluoFT9B/cKPPjexl0h6vNrNEdXt6JkSi0fjFwyr/VO+emMtdT9ofsnP3EronfWHeciqk5bRXjOoZ1mNEXcwnO5FzYayJ9IPAyl+NWJ39I22R31aYYE+z67QK3TkunuLKFZ+/wzPFeNFQxTO2PlID+UEYl73hm6Xoc5qyGBAAMqKKTlF6sv7bKJA7DZnxnMtkXx065wpNJhb7IjgfXkaYFHfzaPT+fTAUEWnAobERx+2e+gzH0EIONKtacZkSX/+V2fgyKCzsw8iW6VwXVpK/0q0jY0WrM4koSenTCqb3Ppt/u4/YIeKyZQKE2di03fEMukpGER4kJAbaVINSkmhiFvSSaBkHOjn3Kdnaxq+4Wjw9Aiyw7CA0Yo1owrM/URzpfkH+928j1eDIgM1ZHMyd8PF7+R3MQoCjis=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.3
Release Details
UpdatedMay 18, 2026, 8:04 p.m.
Changelog

Fixed

  • completePausedEntry() preserves an existing end_time on legacy paused rows that already carry a frozen end timestamp (status/end_time mismatch). Without this guard the service could overwrite payroll-relevant hours with updated_at.
  • RepairOrphanedPausedEntries now sets ended_reason and policy_applied when it only flips pausedcompleted for rows that already have end_time, keeping upgrade-time repairs audit-consistent with steps 2–3.

Tests

  • New: testCompletePausedEntryPreservesExistingEndTime.
  • All 568 unit tests pass.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature0pwv2HKTd56i96aLU9V8qR6lOzimwWXhqhWSc7Qg66mq6YUrCmPIbXYISOwPTJfjpw5M4FhZycmTA2lgG3EAA98ZSBJFnAF1jP7448eX2A5fcEuTpTjFHq0tbvnMjTGAsnV7WNRBnstL/z7SRJSxatvVA/LDs2WLaCxNzVGw/DT25ls7JR17YiNBhzNDVksC6u1AHmZeqx6Jlpo4H4Oi3JQ1cQ4kigPSVi9Hae5kUmZ0jDG77OACeg9ZbtwWpxQllxALQE+WjKUmniFpLFrVea3ngGelh3ef/MP5SexBsuijZF8rIbeTxgg4qdYI+6nwQ9t2rHM5kMAtPgIiWjdsD39cNlPM/y+dQJDHzxddyVpXuWw+pSlLBxMadjPS17X83FksWfvtNATwe64641Ba5F4vTJEQdBclnTXCgwA02ioR59YVQ3c/N8HymdZD3Zy6CGOzGyYvEtlF15YsXCh2PB8Xxa0VeBQSnKASq/LIPhguuuea2S7b3vNkGbOjRvrGhkdlZFT/bVkmh7AYkZ5tZbSACA1lw6WteOtNK5+LP64KLw6B+lZB2Xhn3ZRl3QnYrG6B5FerUryhEnKDK6Or1Z/rlcNhS5uvTCxDeK58PasFbCeiUa4SVg5tZgrUTDy6FjiQ53T4DVGImGcI7vy528e5DHpGSaafPJksvP6LicQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.3.2
Release Details
UpdatedMay 18, 2026, 5:57 p.m.
Changelog

Added

  • One-click recovery for "paused" time entries (issue: time-tracking/paused-entry-recovery, addresses upstream reports of "pausierte Einträge nicht bearbeitbar/abschließbar" and "HTTP 500 beim Ausstempeln, keine UI-Methode zum Heilen"). A new dedicated endpoint POST /api/time-entries/{id}/complete finalises an entry stuck in paused in a single, race-safe step. The end time defaults to updated_at (the moment the broken clock-out froze the row) and falls back to start_time as a zero-duration safety net; ArbZG §4 (automatic break) and ArbZG §3 (daily maximum) are applied so the resulting completed row is compliance-equivalent to a normal clock-out. Every recovery is audit-logged with time_entry_paused_completed, ownership is enforced, and the per-user mutation lock is honoured.
  • "Complete session" affordance on the dashboard and time-entries list. When a session is in paused, the dashboard status card now shows a clearly-labelled "Complete session" button next to "Resume after break", and the time-entries list shows a primary "Complete" button per affected row plus a role="status" banner explaining the state in plain language. WCAG 2.1 AA: minimum 44×44 touch target, ARIA labels/titles, never colour-only signalling.
  • TimeTrackingService::completePausedEntry() as the canonical programmatic recovery path. The controller is now a thin shell that parses input, delegates to the service, and maps domain exceptions (BusinessRuleException → 400/403, MonthFinalizedException → 409, LockedException → 423, DoesNotExistException → 404) — never a generic HTTP 500 for a known business state.
  • TimeEntryMapper::findAllPausedByUser() + post-migration repair step RepairOrphanedPausedEntries that idempotently closes any leftover paused row on every occ upgrade: rows with an end_time are flipped to completed, rows without one are closed at updated_at (or start_time as a fallback).
  • Layered vacation entitlement — degraded-state trace flags & impact preview (issue: hr/vacation-entitlement-hierarchy follow-up). The resolution trace now carries explicit degraded_org_default_collision (REQ-ENT-10), partial_history (REQ-ENT-13 / EC-11), clamped + raw_* values (EC-08), rule_set_status_warning (EC-05), and degraded='model_lookup_failed' (EC-04) markers so auditors can see misconfigurations and best-effort historical resolutions instead of silent fallback. The admin simulator surfaces these flags as labelled chips alongside the result; the employee explainer surfaces a redacted subset (degraded, clamped, partial_history) without leaking any internal IDs (REQ-SEC-05).
  • Impact preview endpoint GET /api/admin/vacation-layers/impact?scope={org,model,team}&targetId={int} (REQ-UX-03). The vacation-layer dialog now shows "Up to N employees may be re-resolved by this change" inline before the admin clicks Save, with WCAG-compliant colour states that are never colour-only (icon + status text + ARIA live region).

Changed

  • TimeTrackingController::buildSafeErrorResponse() now catches OCP\Lock\LockedException explicitly and returns HTTP 423 with a translatable "Another change to your time tracking is in progress" message, eliminating the opaque HTTP 500 reported on parallel clock-out / break-start.
  • Paused / break / rejected status badges in the time-entries list now use semantic warning / error styling with descriptive title attributes so the state is conveyed via icon, colour, and text (WCAG 1.4.1).
  • LayeredVacationConflictException for lock contention (REQ-SEC-04 / EC-07). LayeredVacationDefaultsService now wraps Nextcloud's OCP\Lock\LockedException so the AdminController returns HTTP 409 with a translatable "another administrator is editing this layer" hint instead of a generic 500. The admin JS surfaces the message in the dialog feedback area rather than dismissing the form.

Fixed

  • Navigation icons script — remove duplicate navigation-icons.js IIFE that registered a second DOMContentLoaded handler; expose window.ArbeitszeitCheckNavigationIcons.apply for dynamic [data-lucide] placeholders after page load (CSP-safe local SVGs).

Tests

  • New: 5 cases in TimeTrackingServiceTest covering the paused-entry recovery path.
  • New: LayeredVacationEntitlementEngineTest, LayeredVacationDefaultsServiceTest, and AdminControllerTest cases for degraded-state flags, impact preview, and 409 lock mapping.
  • All 567 unit tests pass.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturerFfQ5Jz3WAqqDDfkSEHAKs0JHmFWSpAAH9qaRFyTjE7CLFTbm5X2pvNh71mEop6b3wvS6upZ3N3RqOPn9R2SB+yGXR5JRkVRX0GGJkIt7cdmQcRDmdLuf+NIWYLguBJsMG9PRLxq7ydIvg07mRMLbbGMeG8baD6rILAN56wApr+QfU6qD2H0p6axB6N7O14ndLARJcUOA2E8QZf+vpFXohC3aXDkIENOjWJDK+MmG48NkGuo6/iTLekWHk+0KRyQrCYmQ5JwVG7MVsFhEh2bhUd+hchqcBJQSUWJufl36z2Mtk4N5/dsIOpjkVzKWLm3yZlaSyefTaZA+is4Qj8d6izsACq6zCt0IrU32EH41Yz9LqPKH2l2QTYgiy70RrFuVA5UO8SmuuGlP1vyzduQ7So28hksbT8N4wsTLEEk09BSCYkqhz4HFAfyvBVE4bTEl/cQe76gnQDnB3eOAyKQX2xDW1Xl9tv4MYQGPijJVL8dVt4FheTPfBb3RVe+Hjr5JZNd8Tx+6Nc2Ku1MYOElgQoF/2dWiXGQW12/WjJnMDH08GTmzUmjkAkOUQyFngwOiSuE04scny5ND3eAtxGwX7Tg582mcpjaEXTgdQMaGtulFv1UZVtR7Iq7B8b5FjUw75kx6dTIcthN+ssihaSaB5iYQw800bPsrojyNKwH9zc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.8
Release Details
UpdatedMay 4, 2026, 2:38 p.m.
Changelog

Security

  • CSRF protection on all state-changing endpoints: Removed #[NoCSRFRequired] from POST/PUT/DELETE methods in AbsenceController, TimeEntryController, TimeTrackingController, ComplianceController, SubstituteController, SettingsController, MonthClosureController, GdprController, and AdminController. The frontend already submits requesttoken consistently via ArbeitszeitCheckUtils.ajax, so all mutating routes now reject cross-site requests by default. GET-only endpoints intentionally remain #[NoCSRFRequired] (CSRF is irrelevant for read-only GETs in Nextcloud's framework).
  • No raw exception leakage in JSON responses: Hardened AbsenceController::getSafeErrorMessage so that exception messages are only forwarded when they are explicit business-rule \Exception instances; messages containing technical fingerprints (SQL fragments, file paths, stack traces, oversized payloads) are replaced with a generic localized error. Applied the hardened helper to AbsenceController::store/update. Replaced direct getMessage() leakage in AdminController::getTeams, SettingsController::index_api, and PageController page-render error paths with sanitized localized messages.
  • Correct HTTP status for authentication errors: SettingsController::update now returns HTTP 401 Unauthorized (was HTTP 400 Bad Request) when the request is unauthenticated, matching what API clients and load balancers expect.

Changed

  • Organization-scope monthly report downloads: reports.js now forwards user IDs resolved during preview to the report.team endpoint and falls back to a clear "no organization members had time entries in the selected period" message instead of the misleading "preview first" hint when an organization-wide preview yields zero results.
  • Sanitized dashboard load errors: dashboard.js/dashboard.css now surface a localized "Some dashboard data could not be loaded." live-region message instead of raw widget exceptions.
  • Resume-after-break clarity: Clock-in copy and l10n unified around "Resume after break" instead of the legacy clock_in_resume placeholder.

Accessibility (WCAG 2.1 AA)

  • Main landmark on every page: 17 page templates now expose a single, properly labelled <main id="app-content" role="main" aria-label="..."> landmark for assistive technologies (dashboard, index, timeline, calendar, settings, personal-settings, reports, compliance-dashboard, compliance-reports, compliance-violations, working-time-models, admin-dashboard, admin-teams, admin-users, admin-holidays, manager-dashboard, manager-time-entries, manager-absences, manager-month-closures).
  • Skip link / <main> consistency: time-entries, absences, admin-settings, admin-notifications, substitution-requests, and audit-log previously had id="app-content" on a plain <div> while role="main" lived on a child wrapper, so the "Skip to main content" target landed on a non-landmark. All six now use <main id="app-content" role="main"> directly. Removed redundant role="banner" from the <header> inside audit-log's main region.
  • Accessible names on all data tables: Added aria-label/aria-labelledby and screen-reader captions to the holiday list table and to the two notification-matrix tables that previously had no accessible name.
  • Live error announcement on dashboard: Dashboard error section now lives inside an aria-live region so partial widget failures are announced without disrupting focus.
  • Manager dashboard team metrics now announced: Stat numbers (Team Members / Active Today / Hours Today / Pending Absences) had aria-hidden="true" on the value spans, which silenced every metric for screen reader users. Each card now exposes a single, fully readable accessible name (e.g. "5 team members active today") via a role="group" wrapper while keeping the visual layout intact.
  • Alert vs live-region conflicts resolved: Removed conflicting aria-live="polite" from role="alert" containers in absences.php (form error), admin-settings.php (global error banner), and three time-entry inline form errors. role="alert" already implies assertive announcements, so the previous polite override could delay critical validation feedback for assistive technology.
  • Page heading hierarchy normalized: Every primary page template now exposes exactly one <h1> (dashboard, time-entries, absences, calendar, timeline, reports, settings, personal-settings, compliance-dashboard, compliance-reports, compliance-violations, working-time-models, admin-dashboard, admin-users, admin-holidays, admin-settings, admin-notifications, manager-dashboard). Previously most pages started at <h2>. Subordinate section headings in time-entries and absences were promoted to h2/h3 so the ladder no longer skips levels. CSS rules for .section-header h1 were added to inherit the existing h2 styling.
  • Manager dashboard breadcrumb: Added the standard "Dashboard › Manager Dashboard" breadcrumb to align with all other primary pages and improve orientation for keyboard and screen reader users.
  • Calendar loading state announced: The "Loading calendar…" placeholder now uses role="status" with aria-live="polite" so the loading and ready transitions are announced. The decorative spinner is aria-hidden.
  • Focus indicators restored: outline: none was used on the timeline filter checkboxes and the admin user-picker items, breaking keyboard focus visibility. Added :focus-visible outlines using the primary color for both, preserving hover styling.
  • Mobile touch targets: .btn--sm was 36 × 36 px on mobile, below WCAG 2.5.5's 44 × 44 advisory. The mobile media query now enforces 44 × 44 px on small buttons; desktop sizing is unchanged.
  • Empty-state row for legacy index.php time-entries view: Restored the missing empty-state row when no entries exist (parity with the other table views in the same template).
  • Reports access fallback navigation: Replaced an inline onclick redirect in reports.php's no-access empty state with a real <a> anchor so the dashboard fallback works without JavaScript and inherits standard link semantics.

Removed

  • Stale Nextcloud personal-settings panel placeholder: The old personal-settings.php panel rendered inside Nextcloud's user-settings shell with hardcoded vacation-days / working-hours fields and reminder checkboxes that were never wired to any backend. Replaced it with a clean, accurate panel pointing the user to the in-app personal settings page (where these preferences are actually persisted via SettingsController::update) plus a short GDPR data-rights note. Kept the legacy index.php "settings" branch (dead code, but still in the file) but pulled the previously hardcoded 1.0.1 version string from IAppManager::getAppVersion('arbeitszeitcheck').

Tests

  • AccessibilityTest hardened: Replaced the "must contain <button>" assertion (which permitted pages without keyboard-reachable controls and false-flagged link-only panels) with two stricter checks: (1) explicitly forbid the <div onclick=…> anti-pattern and (2) require at least one <button> or <a href> per audited template. Total suite: 455 tests, 1 652 assertions, all green.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature0fmMgh2k+umrcI0ItziUajGlS8QKeJdFr3fCSTgg7vQVWg4BCFHonpEcUwfa4kVlfDspQKFKDaq8uOHKCgIK+UZwXyjxXq7+FQGRKfcyfOs9rNBzg+B3VAx4nYo5grNneYtAO7t7Zxz66W0ZFlpBqhNrJMY6TA4bc4tNMRGaIAFi4gXqLstp0Ah+cGqywh55lNrOeuOgFrySRtbChjo6fRhkdAMWjY4XvKxF+5QqtH44AmfQ2HGqOHe8NOjn8eUo0fMbKIbwvAZwafZ0NJQxxVDT9BG/9DpCmvFDug4URG8yKIQdbbmYotaJBw+l4PEiEjpzRJGX0I2yzRaVvGCu6j5ZF/8YYl/K75EFv3oGc6VgypIcoK93/1WTXzykjwVMPxAdGv50f1muSJrVa+6Qcw/j4pz2aE2gWEZ8x1nANuxlxlORcVZkpvPCuDFD+VcqejaZon8vzhW46eENcjGI8oJR1YXRYR22gN6BNM5KD/NPbDmQ9DSsZDgp42lZ34L5+VWj1Gqtf4iqMM7RnZKvxw3bMTFL8usH9lhfjPrqtbzQLWmpiH7Tpwr9Law4ZkluQep/qWR386FPRCOtCOtsIs97GMEM6jqka/uZ/M90AP9v74f8nK/+c6oYXGW+Fq0SKkGvzXFczs2EokKRmyeIyNN013xyazPE/WCUcdGbXtc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.7
Release Details
UpdatedApril 27, 2026, 8:55 a.m.
Changelog

Added

  • Critical workflow audit checklist: Added tests/WORKFLOW_AUDIT_CHECKLIST.md as a concise release checklist for time tracking, manual entry corrections, absences/approvals, month closure, reporting/compliance/export behavior, and public error-surface expectations.

Changed

  • Time tracking mutation safety: Clock/break mutations now use user-scoped locks and transactions; status polling remains read-only while automatic break fallback and daily maximum enforcement run through explicit mutation paths/background jobs.
  • API input and error hardening: Report, export, compliance, manager, and time tracking endpoints now use stricter date/time parsing, safer validation responses, and generic public error messages for unexpected failures.
  • Month-closure enforcement: Absence update/delete/cancel/shorten/approval/substitute flows now re-check month mutability before applying workflow mutations.

Fixed

  • Health endpoint fingerprinting: The public health response no longer exposes app or Nextcloud version fields.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureT26RnSxGZtpmkWUMOT/kRj1pbj9j9dZCmH4GEaIONGYsjG9eFIorh133vbuxQbf+Ow0asxbdP0zK3CUa6iW6FhQkyo2Uyj0+BBVyFPliahtPKh68I8/YcQLJLnzI6i9lZhSCpy7gdMwr5xH14QVEq1gW9nlFA2ppepB0TJVCjpE9Ykc6egd1Fb28mr1KQcgYD39fXKG1R1rfY604eJtjuAnKomAkWecOPaUlElmIR5/QTBYeIthZV0fI79PfrcQdi1AjPIxQWx5mtvNy8vdSyah119zrA/Q7vJbh1i1vshxl65q5EKBh/Qam2JWadnVcfC6FH6CZwLkZwrkVlhfgAHhjRH4N01Mc3fRIbMTg+nKzW+oXANXnWyk8wtLf39wN4Qum+H4Yx4/ECG4aNULfPQki7EUdcLANlafsHKBarmYzITMnCPIzmKbQ/a07tKEsI+36C//sdfV2r15CMxkDfqey4NjtIbb8jv0ye5iv4gZnvl/FdyRaxLiptRiRxIRoFJgVMG1ZKxy6jw4MmIigONvQJ9Npn6//8vAdb80ftJvDCkyHa4DPmKHPoIphqFLLnSWbaUKn+KjfpDYom5nV99ccQlcdWqs5aXHLQR2UDv5gG+NCkLNxLNZcHLl6blsnsqnLGsnjgYLzYKxKJanBSvPkvO5nrpNoRM/3ybV4nWE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.6
Release Details
UpdatedApril 24, 2026, 10:32 a.m.
Changelog

Added

  • Absence approval forensics: Added approved_by_user_id persistence on absence records (approve/reject/auto-approve), with schema migration and API summary output.

Changed

  • Vacation entitlement snapshot integrity: Added deterministic key-based upsert on (user_id, period_key, as_of_date) and migration-backed unique index enforcement.
  • Concurrency control in critical workflows: Absence create/update/approve/reject/substitute flows now use user-scoped mutation locks plus transactional rechecks/row locks to prevent race-based overlap and over-approval inconsistencies.
  • Release safety: Workflow/unit/integration tests were updated and executed against the hardened mutation paths.

Fixed

  • Legacy snapshot repair path: Upsert now handles historical malformed rows and concurrent unique-key conflicts safely by retrying as deterministic update.
  • Vacation balance write races: VacationYearBalanceMapper::upsert now resolves concurrent unique-key collisions via re-read/update fallback.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureFCaNQEccscnzM6rLSgigNgiMK//Ogy4aLpQQ02I290SKuEd1galIkTleu42bUC3jUHSHpnmIDlaOC359unS4KGTEy3nmCdndzTjnZo6r+Pbk9+/vFkufLmhW6rckhWRuZ5FaTDQEtSuZXf/xGdfbdoy0emnIb+n76unzaXXDRbRwiofg80WVWY3ejgfixFajIBo0pYBiWHsjvjA66KtZXYxALqBikSLtr7Qo2BNssYqyDpxnPXjrpabkjwefBgBEro9vtBMgdxO1BiXf2R7YQK7tdea1b1+Z0SPhktPHoetniDAHnLzFucaQdwMVT4jiqwldo5wArfOLOWnFHa3jBDLUVc3RCov3/euMcr2GKxwYR6Zxjuwb++CAMTv4wKuKhju4tfWm6KQfUXCVMciK56XxAvwhf0FzlGBpT0+YORUBc7r0OSm1SbO5R8E6wOF6sUM9QhQCz+VFFyo5QEXxME0pV+yDzFFCBCulYH5VFq+cTXXZ9Cg7LaafpLP0dm3xJ+bnjLf/sNziApiMCQsOvK5DQ/tH6NS1qf87PZdb2FeciFFCO9eZw5JP842ePPPdbfq6hhz36BOv2gHqY3b4ze2H8Jp08II7/a3FWKbkz0nXN0G0HLQYDkBAa22Sn/c6Io6hGcQI/0fuW8pHJjhI6VgoCZpdY+dVD00/7Pu/HXw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.5
Release Details
UpdatedApril 22, 2026, 7:23 p.m.
Changelog

Changed

  • Release packaging refresh: Bumped app metadata to 1.2.5 and regenerated the signed release artifact set for App Store and GitHub publication.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureZpb9Oh1bIRpGiO5z2K6o3xhzr43wa8RdfzfLXHg7sEGwS8tzN8GaAdyCnk4IoZbFQbrcrwdyFCK2ifzBqN9OrxHGAqGpFLeQOaHUDcH/imXCIFxYAch8kwW545iujuTkvSBdlIFa+DAG6lFFRngQPO2aO9gC1B0Vp6wLTAjI5NDNeM6nVNyCIhbvaC4jUfIrTjrCfvgQ4hgpJ29pYU0GdY6bEgwKCQQgUuJVEB6Hoay1M40Xq8eLzdT/UfobFlC1nV4Anda02g1AeoM04FrJQUfD6lCo0s5pFYAJ82EM5OyzWwi/xgEv4y54tao/UBX6yoUvIdHa7yh6bfoKy0dQmzb+iHl8eQTAzCVQAgWWu58F5J+k884kYMwBNBdcuymPnszTlypmrQoRRjvI+UI2f8taEikdX2EUAbwHkBU8U8CG98NogPFy/w9drgLqq6gvBCtuuz3BLC7fsEfA2/Lx4XYEwCdbvoFMc2GNZJMIujhs1jsbk0Hzscz3NCmaILzbZpfKr59xfZy/bxNl2Yi8nl6L9tJRyaLdxJ7urZthACHIdATnAqGretxEcTox69OnoR+Pir+0N/8ujZ3Z2K2C/5zu/QGwGgaz+WeoKCwGjmTb3JCG3jh340kFLnp8TnzUiZpduSj4Bz4o7yojTzFAPoQrTUYZrv0llb8PGSoPI8w=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.4
Release Details
UpdatedApril 22, 2026, 7:18 p.m.
Changelog

Changed

  • Publishable release refresh: Bumped app metadata to 1.2.4 and generated a new signed release artifact set (archive, checksums, and App Store signature) for App Store/GitHub publication.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturefOspm7RunA6JBPSZZ3vwdD+rRVZ5qOeMbZFcndytc+ZU00QoTdCYDFaEsDlUZtuCnpLGgwQ1x8o0jBhi409JtsZrNyD99XhzBZCKNl/nysKo/jDLa3h1msZ/AWKtjJUlyLxEPvPLzM2e/bg7DVOJKi0lsvq6nmUxJEhlLmhdgaONOlbAsBdtrtTKOO7DSxslFRRW0fmofVEdH8lL+5y0l/RtV5Gd6bMtpQ5bzHSoai9OMuOBFJ98QX9k/vX4qAuJUGVRvivJmMXDmiD/kPvezmia5no32RbXtYgYBUVY3Y9kfOza3mdFIwlHSD0bnjCI22QWUCBa5v59k+OuMPzPxCy+bzBl/M6Fu09TrNCDJvejpF/y9vKl7Wxgdz4ynaA2EZZ+RN15cGiTdOWVzjcWtnXBMSh9RCnBZqSCz8dFq1qVLUy16lBciLRNa6HofkEvemUN1oLbokZKLQlyXMFNxT8Ny3udUaOa5qKFDLbwgTttFuHDfn4NWOeI7JQgJ5kntg2KMpB4VYXvDwODCEcolniDL08kWuPbxOxd0tTR55+seYBfrSQrrGt46a4Vcp683MvMn8fx/el7vSPx9ifD1cUd6KMf/fi5IJF+pohxoCZlNepNdQGmaKNfWh87EGsdUl7089uKLWdwGWeGoHdxrBuRBhcfIU1HvCH+KVcvT9A=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.3
Release Details
UpdatedApril 21, 2026, 8:11 p.m.
Changelog

Changed

  • Release packaging refresh: Prepared a new signed App Store/GitHub release archive for the current code line using the Docker-based signing workflow.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturexYrrvEAHPwtfVHCBhNEEi7sX2LvqPOYNCC1AOYXNIeoRkUCxYLFTc29MwrgaUMoSLGtoZDChDD2eKsUH6MY+y5Jk79dKZg/ngf2/YBQpmMevl8Lp5eSGo2QES6rBtWYa1GFOEd6sVU6RLcy9tNL3toOxw5Te3QTskzeamEGChd0JYprcLZSWJG1kRu8Y8c32p5Rwbwu1tuq3AAW+i/6Bq4bxztKR6PGkZ6uyTbVaW3p0PwMFoJxceVu0/MsbMpftQaGQHr/1h6nBvbuj1WBkfi9W0PHrl+0zRn+5FwoUU9dECfeHuQAAcXOcJsKT979ewplb5+vPgNSeN2SSTWoGs9eYYIvUzznpyhuqSa1aplwXO/U0xyTXeUE5fiAQFlbnxtZ7gjmeLBkbAR/gF4aCX3NEPGLtw24gY8jomJ67+foeoM1+AJM73aFgTH0NjYKUetACRTFgB6gJPXl97JrJxd7sTeg6xiqlNKrWSvxiAO8XkjHCUV1BaPmoRtyfcNnLxmf0MGCVUuO4btz7JH5qy3q4H8XecbNYpnEeer8qxzTkw3toonE4+LVgbHV0nW6uu/gfEvDtYZI0wKx/A4vQYSQ7WEprMn9SbjnXbaMFOcG81GT2HifhcWZH0/YfFzz+sRng/TvZOkuf2iUq/9EjnKwkyygMSlHE7Si3kYXldKc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.2
Release Details
UpdatedApril 21, 2026, 8:07 p.m.
Changelog

Fixed

  • Localized decimal inputs in admin settings: Daily working-hour inputs now reliably accept comma-decimals like 7,74 and preserve two-decimal precision.
  • Legacy hours API payload parsing: Time-entry endpoints now parse optional decimal hour fields consistently for both comma and dot separators, preventing silent truncation in backward-compatible request formats.

Changed

  • Input precision hints: Updated settings input steps/help text to align with two-decimal hour values used in 38.7-hour week scenarios.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureeG9EHR4R6Kg1X8OQ9g5Q0yPR7Y7yp+snb/sVhhLXEOtBIFd4xLZd/xi0GuLYF4KBZlPCH1GbRCy+q/kbjx7MyqlO2rHn3Cef0MnwJoLp9czZFJOjVJJpkoZNf/o9hh2OpeK+sNS7ghXfC5Pax2oicQFmeQeKQKLaTwn0AcJgvQrF1laVjQiXQopE98v16iClBjZ+KuybKcRmglxbd1N8dx69nBB0uyLQdkQIhnwHccyrlPCBzsXq55AtIEXGsitgXtquHKOk1bzBwM3uwQZoNRi4RIB/zWmOv0c7+71QTw0i1DMUsz+FUrTw+bBY0FnZe/Q9ageaUvwOb4bHUJYt1cuWPGEufAUC1w7ONCfHGASNkDv34msX4MQEaMf28k8ohtWlX/fzNIxL63Erijyanuo1tf9hZFeYEXmCKwXAeWOL0O/lXWcTGTvEOAD96sSv6RIcIOwHBLqxGUHiCQzJkKZJ3hjv3rrpOeneCLOz/jMNJrEgYCihLn1J8cUEPPeP6VH3rNthDuQOVCi63v+0X1uubbM6DQheViBYTA/z4wEAP/2YsA6rsXATB0JR4pOIxlsiT0MgjxIyrfctOJP/4zMU4645rSmZE+NS0TF46gpf8DF6ai0zilMmaHf9xY72qGZTICjvtIUcmwbMhRMqG9fmYomv5U2/jd3rubayPDg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.1
Release Details
UpdatedApril 21, 2026, 10:50 a.m.
Changelog

Fixed

  • Paused-entry recovery and lifecycle: Paused entries can now be accessed again in edit/delete workflows and are consistently finalized as completed when edited with an end time.
  • Resume behavior for same-day paused sessions: Clock-in now resumes a same-day paused entry instead of creating duplicate automatic entries, while preserving the pause gap as break history.
  • Historical paused leftovers: Added migration Version1020Date20260421000000 to repair all remaining orphaned paused rows (including cases not covered by the earlier one-time migration).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturewHjRsCMFlhEA9EgrgvzuDGiwQsEIOmqNFH9oA9Fs+lJZOluUc6XSmPeZow7uso0PwR/b5YYt+f8KmOoIwuJepnD1TTa5ClzBP5zx5gZq+KIloaEGzVPTnHvHJuc4V8q4A5BYEXvYrVvEuPgufr8BOBNy4SLwMKYQlJR0LhDLn3ShHowJ+VDaUSUjOtUih0uUCsNI54HhaAAa3EfKpgDqc2+jhM7WvnIzDGRVYF4HbPBYPpn+1eWOyOlOgq0YIy5M8+4shNLiGeIRo7Uepk9+HnDm6vjLdYB2iE9AMl+vSCGSdQTrP0Z5ceXZBZT/bM0t4Af3EfAP5seJ/sSQIYs1a5T8RIneJ7DwyFbZdGelFSSBZoMGDevr4IUUfAB3NIKNlPZsxAOv9elrF4AjLJZhDVB6i7OSVeER7yLqrIgMhBFXiFpr095gYQ7Wn6VCcBWwWVS7cWXa0xN9Yl00mn0z9GcVagRvncJ28Y0wSgk+GP/BDalUHmD7wHSL3pyXIWxpqQ2OJHi/xT5Myx4T+HVsywgRwAFaOLjV+hm8hkJLxd70WG0e1oo21m/DtTZZ1R44+BDdRGMJIcabWxJ/zFhYSZvVmoL2dpUlJhPgBBp1Y9Xp5pF0zOeLiGSMR4ON/Iys2jpsbAd0/TxW55NaEFOpZRRNYt3VoZJ8oqM1n1sHZX4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.2.0
Release Details
UpdatedApril 21, 2026, 10:08 a.m.
Changelog

Added

  • Vacation entitlement policy engine: New policy-driven calculation flow with support for manual_fixed, model_based_simple, tariff_rule_based, and manual_exception, plus admin simulation endpoint.
  • Tariff rule data model and APIs: Added versioned tariff rule sets/modules and admin endpoints to create, update, activate, retire, and assign policies to users.
  • Entitlement computation snapshots: Added persistent entitlement snapshots (at_entitlement_snapshots) with calculation trace/policy fingerprint for auditability and diagnostics.
  • Admin notifications page: New dedicated admin UI (/admin/notifications) with HR recipient + event matrix management and a dedicated notifications settings API.

Changed

  • Vacation allocation integration: Year allocation now resolves entitlement via VacationEntitlementEngine and returns entitlement source/rule-set/trace metadata in allocation payloads.
  • Policy migration compatibility: Existing user model vacation values are backfilled into policy assignments during migration (Version1018Date20260420123000) to keep legacy installs consistent.
  • Admin settings flow: Absence notification-related controls (carryover expiry/cap, rollover switches, substitute-required types, iCal and substitution-mail toggles) are centralized on admin notifications APIs/UI.
  • Working time model schema: Added work_days_per_week to at_models (Version1019Date20260420150000) to support entitlement formulas.

Fixed

  • User deletion cleanup: Deleting a user now also removes vacation policy assignments and entitlement snapshots, preventing orphaned policy/computation data.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signatureu3gPfbToOow1ecZSrYUbhzoOp6/Fb3syYzSdx9CNYBvsUDqkoBODyN714AKc/4PF8hYrf+nk+A7ICF0GC94uBW8MsNWCHRQ1GEmhhaNSePTNjV+JCCOR9SINE1JCYVSh4avkBX7evJrRZFTOoxRGZxKBSY8ubYG71+F/N22A3qH8wzu6yYMBi0hrt1oVOfFkhrkBKeEwip7Bm0vrEzfrhnNJ3qsqf5q52F9sxUFZNT+/JLDBPu/ZAokssMJGTgbmKwdc3qQzdI/d0zNPuZJwUNjjgvU+TLeFJRkOKNghRfdkVotVcm63NmAf9afJJx3QkCTOTbMchC9sKyvlnIbG68WUZvsiAUPRW5o2XxXK71zZo8y+GC65ZazjioV/4ANt6sEItnJ0MSylRmWFEXMTMJHgCiqqp9hwZwxs0IicHLsRRsnUDdT7yMgOdB7082cnUFJtWM9Me2uSvYx4QUfPosWZhkMqpwagxJ80EnYSfc12/cEXbr58MbdqyQeCj2dUG1iBPw0eVooOWxf9UwOnNaUKV6ynEGok/mYM3qS8XnNElFpliKoRAfBtgLsCpV7O/ChhjE0gPNILNasGMiofSaAd4cHZjSZI/7Cm6FkOSrGju6XCPubM6XeYLbyZ8pv1htd1H1NzUIsWYXG23nPhICNAdOvEcbIXWEw8H5b2Xtw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.14
Release Details
UpdatedApril 14, 2026, 9:48 a.m.
Changelog

Fixed

  • Approver deadlock (app teams): Absence and time-entry correction workflows no longer treat “has colleagues” as “has a manager”. Auto-approval when no assignable approver exists now follows TeamResolverService::hasAssignableManagerForEmployee() (explicit team managers in app-teams mode; legacy group mode still uses colleagues as a proxy). Prevents requests stuck in “awaiting manager approval” when nobody can approve.
  • Time entry corrections: Same assignability rule as absences (previously used colleague IDs only).
  • Admin users API requests on /index.php instances: Refresh/edit/history/update actions now reliably resolve app URLs and no longer produce invalid requests like search=[object PointerEvent].
  • Admin teams and settings API reliability on rewrite-less setups: Central URL resolution now includes a robust /index.php fallback when OC.generateUrl() is unavailable/incomplete in page context.

Added

  • Repair step ReleaseStuckPendingAbsences: post-migration repair auto-approves legacy pending absences that still match the “no assignable approver” condition (idempotent).
  • Frontend URL security guardrails: Shared AJAX layer now blocks external cross-origin calls by default (explicit allowExternal: true required), with unit tests covering URL normalization and external URL handling.
  • Lint guardrails: ESLint rules now prevent introducing raw fetch('/apps/arbeitszeitcheck/...') and implicit external fetch(...) patterns outside approved abstractions.

Changed

  • UX: Absences UI shows an informational callout when app teams are enabled and no approver is assigned; detail view shows a defensive warning if an old pending row is still stuck (until repair/admin fixes team setup).
  • Frontend architecture: ArbeitszeitCheckUtils now provides centralized getRequestToken(), resolveUrl(), and isExternalUrl() primitives used by page scripts (admin-users, reports, settings, validation).
  • Mobile UX consistency (WCAG 2.1 AA focused): iPhone-safe-area-aware spacing, improved touch targets, clearer section rhythm, and better visual hierarchy for normal user pages (dashboard, time-entries, absences) and manager pages (manager-dashboard, manager-time-entries, employee absences view).

Documentation

  • User manuals (EN/DE), tests/WORKFLOW_ROLE_MATRIX.md, and developer documentation updated for assignable-manager semantics and repair step.
  • README and developer documentation updated with centralized frontend URL policy, strict external-call behavior, and mobile/iOS layout guidance.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureVBSDJh3veK9J7eUDKGFw/xB1ypmBQrjMDzamatQfncYem1qg9kNVWAnHDH+fGRlFJtrBH+fOu+MRTFZuK78DU/W18IQglCtTbsH4MdaHLHTwVz2JOxeGJWmx2p1yK0ulK0vbDgCLXQu5B8gR/L/JYRGFo0+FpwuRvxrpp1BWrX5m9mQLgoxn3hOj2r+F2m0wYdEDWhksF6VzLbHyr3pIT9hu6p1owuAZzr3Nqtva4tZK0WGgn8xa5bDwZqJdWSyQJ04JiCZisftYCOJz8HNfq6o4MFTLF0aQpYxUH8wf6gz5pkfUOKIemq4Ui8GqRr3Fxo/DW2APAk0GcwWyY8ypEiY2RNi6IkGv3K9p8mFamDxirDeurOX/hwNia1Lt4HCqzJATjWpmaCEAoBQWfOCgozI9o+h8cI9LhHp3LvK3VxFD/s9xjJPFLZ9y8b98hufe13Uq5/NYzqo2vQ1DgQXyCbRjsiMbqDvz+yyDmXM+JPV8U8gTKxTD8y19VoiVIlWhAsI/zBmxHC84G2htaCHBws47cGhmJVvQDXGz/1aae9J0of1bGoOIERyEFSOAzmUN9fcvdVbN+77wn70QQ1k7GQcw6jAEScIQq8Pt8n7pBTECeECk6K4baNfaTT2+kZKLCdD1mdaJII84B8+XXxmxIk+VI1sarNlMIvPAk3FQjww=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.13
Release Details
UpdatedApril 13, 2026, 10:46 a.m.
Changelog

Added

  • Month closure grace period and auto-finalization: Admin setting month_closure_grace_days_after_eom (0–90, default 0). After end-of-month, employees have that many calendar days to finalize manually; if the month is still open afterward, a daily background job finalizes it automatically (same snapshot as manual finalize). Pending time entry approvals and open absence workflow states block auto-finalization. Reopening remains admin-only.
  • App-admin allowlist: New admin setting app_admin_user_ids to restrict ArbeitszeitCheck administration to a selected subset of Nextcloud admins. Empty selection keeps backward-compatible behavior (all Nextcloud admins can administer the app).
  • Security role-gating Docker test target: Added scripts/test-security-role-gating-docker.sh wiring via make test-security-role-gating-docker and composer test:security-role-gating:docker for fast authorization regression checks in containerized setups.

Changed

  • Month closure UX and API: Employee UI uses a clearer card layout, visible feedback for success/errors (WCAG-friendly), server-driven canFinalize with localized block reasons (feature off, future month, pending approvals). Manual finalize rejects future calendar months. Absence workflow (pending, substitute_pending, substitute_declined) is enforced alongside pending time entry corrections. Unauthorized API access returns 401 where appropriate. Admin settings: dedicated “Month closure” section; grace-days field stays editable with copy explaining it is saved even when closure is off; reopen uses searchable employee picker and clearer administrator vs. employee wording. Form validation error callouts use higher-contrast text and tinted surfaces across themes. Auto-finalize job logs per-user failures for operations.
  • Release/signing workflow hardened for integrity checks: make release-signed now signs the extracted release archive payload (not the local development checkout), validates forbidden development paths are excluded, and repacks the signed archive for deployment/App Store upload.
  • Admin authorization enforcement: Access to AdminController routes now uses middleware-level app-admin checks with a dedicated exception and a consistent 403 response page for authenticated users without app-admin rights.

Documentation

  • Deployment guidance: Release docs now explicitly require production deployment from the signed tarball only and document the common integrity-failure pattern (.git/* / node_modules/* lists) caused by signing a dev tree.
  • Deployment helper script: Added release/deploy-from-release.sh to deploy from signed release archives with safety checks (forbidden path scan, required signature.json, optional app disable/enable and occ integrity:check-app).
  • Admin operations: User/developer docs now describe how to configure app-admin allowlisting, what the default fallback is, and how to verify authorization gating in Docker-based test runs.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signatureol/yHOgiMCOj+yYqb8HC0g5laqPih/kTTbBB12bDawwgGQGVdx+GCBNaSmM8Sgu2jRB6PJWwnF1qFQQ6MIHWCjFzuOQeyL+sDEGH0VhI/qgbCmyRKZnBKAyUq9BBrxux3zaI6cN6QD76nP27UCU4C/OxW87nybYxy4WqqdOSOR0Af9QMkUg/VZLhRatpageqRGkYSFl+3ZwEg8qhlpDyLH3lh3xSG6+tQsyy9yU4La+XDiZ63lG2yF1RWHQ1/irb+dRrPEs/I1wuLvdZL+6olqx7MTogIylUqrJyux7ycTUrC/sxTBsZYJUQ2vGFyGzO30qARQ+KSOJtai5Upcx7WZxHv98eS0X3FGI0QUhC2NwIE2ahn0mfH/YjuRW5wBn9nsDG03KPpDaMATyvxTD8BbzGTM9ziuMKfOzd2HfYxMWDX/GF4LWM/eXpqsO7E2veMjtIClAcMI6vZhJKVV4mxXHxMkFIdvTbaFmPrWEAhFRoI+0NHQ4y3ec+goBucU+E4gHCyicVOT0T4n3NH6U+nOs+95d5cSA85Dz+LF7ZLLYU/rxi1ybC36fVg8igg+P8YvH555KQNizrYNJ2xdglmirJcs0XcEwZ8/hVrWfzuLUgKbMNXlqa2dgRzMnfOy9b5bNUPez9FKsqEqAc66dUr9JnDiR+poFgQBlCAnZ7vbw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.12
Release Details
UpdatedApril 12, 2026, 4:25 p.m.
Changelog

Added

  • Revision-safe month finalization (optional): Admin toggle month_closure_enabled (default off). Employees can finalize a full calendar month; the app stores a canonical JSON snapshot, SHA-256 hash chain, append-only revision rows, audit events, and a minimal PDF download. Finalized months are read-only through normal app APIs; administrators may reopen a month with a mandatory reason (audit). Monthly reports for a finalized month use the stored snapshot. Database: at_month_closure, at_month_closure_revision (migration Version1014Date20260409120000).

Documentation

  • User manuals (EN/DE), developer documentation, and compliance notes updated for month closure, retention context, and limits (in-app tamper evidence, not QES).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signature0mCLz3x6v/VzKxsK9I8J3HAMtz+lr9Z43v3UN+tH4hZeZLXvuXWayTxLB6EYKXXnNSfkvF5KMiYJqh3LJHUCTcPUgGfPqNDwCkkTK51T0cmghwWPQylVIe9L6My8a2Pu0sVCrG5P0Ev5t7wdLQNMSxKcHYKXYT7B2QvQG+ljdNKr1/ywfXDEpIg4yzCMnxVdfGIBiUNl4vUIYOXCNt30fUXiRCXHfl381LcA2Bv9ZP+Ddxk+qEpa1iuujWcRg6o32YRCESwDAO2IoXKEvLy16btLtNQd7wL+E6lhCfgST/jp+rWPxh4RSJ8kBlyaBYo8LqvhvMRpGqhYfNOJZTrq0BnKQZfjc1qnAcIHMDFjBfUwi8tp0/bmxOnXmMMFZZtGf6rGLUYinb470whWKydzhIib2K2kSTN9GrRvjmp+osUh9/qAlBzN5wRutIBewKqM8SkwJ52dYiYWU5jAyf3fVxXqRJs970WUccI7udQ8A7J9XqkmCRUBvl46mPugz0K481/X6cKHiZBK9681njxRWorGVGHpCiz92T+Ug2W+bRIBYLBM0oqPd9Dp2rXQ5+UFLDTC9eDG8WP3VVxsK7d5xtK/xWC1fSHy4c7Mgp8WAVITY1eU9ftn1tS8BHZxcgz7EvgtPmamoKwb55KKFTxQu4c6khCWaZ2pPQvXQjxtrNw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.11
Release Details
UpdatedApril 9, 2026, 2:45 p.m.
Changelog

Added

  • Manager employee absences view: New in-app page and API for managers/admins to review employee absences with secure scope filtering, pagination, and localized status labels.
  • Working time model copy flow: Added copy action with modal UX, unique default naming, and safeguards against duplicate submits.

Changed

  • Manager navigation structure: Sidebar regrouped into clearer manager/admin submenus; reports moved under manager context; compliance link placement adjusted for reduced top-level clutter.
  • Manager employee time entries UX: Date defaults and formatting/translation handling improved for clearer filtering behavior.
  • Calendar behavior (rollback cleanup): Removed in-progress direct calendar-write functionality and related admin controls/status/test endpoints. The supported behavior remains unchanged: no Nextcloud Calendar app sync; optional .ics attachments are sent by email for configured absence workflows.

Fixed

  • Working time model modals: Corrected copy modal interaction flow, source-model presentation, and delete-confirmation localization/rendering issues.
  • Absence iCal hardening: Added stricter status/date guards, recipient deduplication, and privacy-safe event descriptions for substitute/manager recipients.

Documentation

  • User manuals and changelogs updated to reflect the final calendar model (email .ics optional, no direct Nextcloud Calendar app sync) and current manager/admin UX structure.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureHwGRZcCLjb/plcL+LoYgcSBNEXoLoZU2DlOb7pcOx6X41OU6v9SkdO5YXOynEBr7kmViQeQzJfLyTUTRSfcqLlz4jC8KL7Xmaa7rImQ0EGSVpaBmmUuHC0MWlrhWWMEkG52smtFFalq0GZy0wLhcHRc6BtqCzilQLju2jS5SR6GTPWutj0i9LsbKsB6LFzkbc9cAbtcRCUjzx9A2oU/EAA1BhRBlyQTvR/OLyDa2FU/CBNWrm3I9293E+D9UP9gMBhKvSH5f1DXF/TpwiCEzYB/NRR0KBXvQb30whbv6O/WJfCEs9z1+wryRvNfGjT0+9X4C3tPtLTpyh7noU7NK7VzS0Cl0/TbACvlEY8yk9I+UPbNYA9jUiNny2JpAh6syrFE3k2RrhIpiJ9iLwqKgUYN2rlx6LFtqWP1NlIExC97DdmCTt1YRTyeDzi/NrZuGKHl5JBtCJWZalX6KwxjJd4oBrxoy1+i/2BLSpjoUlvPQ2FHPlqdtHWcIqryrVzmV+8ZJyxmo5EVJR6bmGESQjUovJ70j5KIltEg1OM/5MAyJ9hkIBJxjXiLTvocREbYOdoicChFs9aQFbDX0VN3BD4q6FNSiV5UXRsbzo57lxa4n51hB3tjoQAJ+rBlmMyVez7u1zNj+5X6lrvn7b5/5UQg2oHpaR8Hz1iPPou7E/GA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.10
Release Details
UpdatedApril 7, 2026, 7:49 p.m.
Changelog

Added

  • Vacation rollover: VacationRolloverService, background job, occ arbeitszeitcheck:vacation-rollover, migration Version1013Date20260407120000 with at_vacation_rollover_log; unit tests.

Changed

  • Frontend l10n: Shared templates/common/main-ui-l10n.php and teams-l10n.php so translated strings are available early across pages; related template and JS updates.

Fixed

  • Manager dashboard — pending absences: API includes summary.typeLabel (server-localized absence type); UI prefers it so cards show translated labels (e.g. German Urlaub) instead of raw codes like vacation.

Documentation

  • docs/Developer-Documentation.en.md: pending-approvals API note for typeLabel; user manuals (EN/DE): manager pending approvals show localized absence types.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturekmFxrMFQus0US44BSrw/0eOzjGU8zutOf6Q4Dqcc/39RNDiCiQOKB55We29dsKBZ77Qkk8fbitvBMURDmfLM21hqyrDTfltj77MNdonON7hcINJKQZG2fGLz3Rrc+10mDQDAiDqVQGOLrpJBQVuA+TxdUEA1C9+z0zwvmHLdlBEgXCw7k/4FoU8aKCA/Jcp02Fjr98PG+1MW5SbOtTs8oQG2iMpRe7Ogo+YzqZtU11KZ4tOr8zEblZeh7oSG+AaIlj16YscKKCWAL3MLmyRvYTXWpPgsu4xLp+AUvTGbSEKUlDeEznDDkGpUvVrd2pTm4Y7xyc8X8c/0WQRqWuioiqRLUHHldJg8MjgL4s7mQkqy95dfZ/xQRC9BAc/cbTceynA8PD5XILnQAVgVRe9hXsji6TgN2EURulrVsBbCN1wCAp/Be9FqH7NYiQYxhmVfYM3kmyMdVe/+owslEAaMcmjT/QcZQlCeJj5SNOXCqVwCsks0ijINP2utN0XO4mlHkCt712QwFAMw86rSjnuX7eA1W6w2OpFjFFobOekDaUgBs8ID4LMgpOWJSGTI2P9AHtBJTMNSrRmsMzQmafZYdBm2F9gO4tz9ktxbhcmBFWpTvNHZimE6Re354pnTOQIQ4yCKU+8VsqYEJxdxe1JYXE2yTeNCKOCcIywL8/hvVS0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.6
Release Details
UpdatedMarch 27, 2026, 6:08 p.m.
Changelog

Added

  • Development tooling: occ arbeitszeitcheck:generate-test-data CLI for deterministic demo data (time entries, absences, optional violations, demo app team) to exercise UI, reports, and workflows locally.

Fixed

  • Reports UI: Report type cards are no longer incorrectly disabled when a team-related scope is selected (team scopes still use the team report API where applicable).
  • Reports (tests): Team report CSV download test now reads download bodies via DataDownloadResponse::render() (Nextcloud API).
  • Team reports: Deduplicate user IDs before permission checks and aggregation to avoid double-counting when users appear in multiple teams.
  • Absence type badges: Stronger, theme-safe contrast for vacation / sick / home office / other badges (readable on pale Nextcloud palettes).

Changed

  • Compatibility (dev): Local development stacks aligned with Nextcloud 33.x (example: official nextcloud Docker image).
  • Reports layout: Reverted an overly aggressive “full width” parameter form rule that could interfere with scrolling/layout on the reports page.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturehE0UvSaJEnunYMHOd5u3aR+5MyAg2Pl78l3t75Fx494nh6CzImBfoaswZXb9agJ6Iz1orktgFsKlTqfZoSGNxuZHRiRjcbtC+LsLLQsjONX5i5UOXK6crz87+6TEDAPkgdr318s+w9qHvTic2kdcdx+rpqbBSMIAgU/GuVZjyp4wtCV2Ti9VFR1pFzAlmH95b6WVCQCdTYmWs7LsLY//midoEYCd8JXSicLvr2nobqTL/soYZdR/39931AgpiUO5B9Rd0Wo7NVhk8C59bmlNqkLa8UDZHTZ/Eseks/njP9CdRsgdaUiqIm3libscOPzoFg2abyJpIZUV/nV8acOq8dh/XNNVRuLxxHs5v5FcByrnuxE4G1IbyC/FtB1KFRQlGF+rwwSEzBKdkNCdH5zbJ//gEgRfjZJb/Ijtma9+14jeRub/oLHQx0Mkh27aVMBPbqDI8LeuOLWo4Gbd4RXFknth02gSZpk1/Ko4uE90R44RcO2YUS58qvKQkickIoDEQId9w55FIEyP7LIAZa2bXl9qYZAA+CHCwixsBKi3a+yADg/wWaN4roVQ4LobTjp1adPOOVWbTHSemHRgEsqpboMxRXcrRWan8pNiQrnvTbJwIu9i3Q6zgHtHXe6RviFMzwiMJQTdvLhhHuANr9Lt04cCZjPS2dWfjGCZKVfo7hM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.5
Release Details
UpdatedMarch 26, 2026, 6:57 p.m.
Changelog

Fixed

  • Admin settings API URL handling: Prevented duplicate index.php/index.php path generation when a route URL is already pre-generated by Nextcloud.
  • Frontend error handling: Avoided unhandled Promise rejections in callback-based Utils.ajax() consumers after expected API failures.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signaturedkvj+LT0qxzHO59iXnzyYCXDEgfS9OMri9yD8QWcQqS/VPzNKFBHIHDqX/2JmnEuQFM6sKf+jyx0QORDIAC4h2XiZoUlJe+MHgZQGGqa/mA/SGFQtwzlxWw2A4Drm1ioGkOIwhGo5Ny0zIogawfyhPtDQX7Mjj2K9x5+OSHQKtQs8LGRiyy7EsVJUC4fWworktCvuqRYpvR+rY2GfSu0CcWWZVItcEYqAfDFl3UvmWag299QrF1g7SOVY1EcoDH2B+O2mOwXwj6JjWNhz4iUkdcbkthaHPwZ12cUTOYLOtopIILuRTdlXiYWqYvLn24yZUObqmS0LbNcyzAF8gF8LDOmp08FxRCo6NY4L9HJcvgaR4qDkOpiC1aj/9FK8LmRnmdOvH9FHIqr2P6eBP4uoetMWoMbW3QAqvizVMDYPe96Qj1m/Cwp2ogV5+D0JOt1Ms02LGHZ3pcBp0vojoUu52pdP+dXL1d0ZN4rzSPEVQboJllQz4dyahtQ55l2EuDdk6VVf35oOPFLt5HqIF84tFYbY4moxafMunMI2lSWeRj0jCxApnTcrjuWDRuG8Q/fv3Za2gtkSsx9XNLPAb6YNOrgKFEeZRtSIp7L2V6shwxn9H4PG2uETboUm44RWkoZO+JZFtNTTlZpij4B5mRvo/OamgruxwI6YgplBQXObSw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.4
Release Details
UpdatedMarch 26, 2026, 6:40 p.m.
Changelog

Fixed

  • Routing/compatibility: Added indexApi() compatibility aliases for legacy endpoints to prevent 500 errors in the Nextcloud log.
  • PHP fatal errors: Fixed constructor signature issues in AbsenceService and ComplianceService that could crash the app when loading services or saving settings.
  • Reports security hardening: Hardened report preview endpoints with start <= end validation and a maximum date-range limit to reduce DoS risk from untrusted parameters.
  • Admin “whole organization” scope: Correctly handle admin organization scope (userId="" = all enabled users) and enforce access checks so preview/download data stays consistent.
  • Reports rendering: Improved Preview rendering for absence and compliance reports to match the actual report data structure.

Changed

  • Reports UI semantics: Team scope is limited to the team overview/export semantics that the backend actually returns (prevents misleading previews/downloads).
  • Organization download guidance: Added explicit UI messaging for organization scope download limitations until organization-wide export endpoints are implemented.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureB+kiXQiNbiYsWVOlB3wiTffKZj021JMzAUzhQRYuwQmpszoGICQ7cCChEeggNXAMuOsRrPkznqB190jArt5Sfp7zKL5I3Z7IjyH6ur4aAqf6Tddq93/6Vb4W4ud9G30AJhkh3X0PBZ98bcOPcrxiaMrOqHryaIkcQ0os1pJnCAZ5v/zmUZGz/rVHxc0VNUGGvJZnx8Odwgd0r9z3McM4r9LL7n9+CrwtDMOVS/fUwAapkdaqM381pkLCa5BHM8VJd+ARz7Tt8rPVuVBwXDR9pkq38eoD9tQ61QVbCqrfsf4/8LgcbNlrHjWVRrAtUirX38JlJgFBKvmzaORvsgylNFggcrZ7sIx4o29kPPkFWZaUee0TKI/uc3WlThNIj/i4+sVTZ2Um23cfon/wr/sHByJIMOsFrw60s6RPm/XjAxeTnJbrm61ms9a0kKTodDR7puH0guqBQJX/CTJUQxcoPmKcfVqqblI2Ll/efOzi/BHYEEuiMGRVfYmuwtlALuFODD8ALFhf8EYmnB2EyCTLJwR+1bSUQF6/a/p4PP9cVSRKDbfYY3rpSU/QXbM3XTn3fET1dqE98FWEqPK6iNKdoMrcsZ4gkKNMNYKpAjMB9kbemHOVPNCIDVTIkYsVQO/edieH4N3EPouwzLWCvQVqWpb8h7SPbTslAhg45WtVByU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.3
Release Details
UpdatedMarch 19, 2026, 2:41 p.m.
Changelog

Fixed

  • ArbZG compliance: Corrected break check logic (9h/45min branch now reachable; check ≥9h before ≥6h)
  • Manager logic: employeeHasManager() now uses getManagerIdsForEmployee() instead of getColleagueIds()
  • Reporting: getTeamHoursSummary() respects period parameter (week/month)
  • Admin users: hasTimeEntriesToday is now per-user, not system-wide
  • UserSettingsMapper: Fixed falsy zero/empty-string handling in getIntegerSetting, getFloatSetting, getStringSetting
  • Routing: Moved exportUsers route above getUser to fix route shadowing
  • Version1009 migration: Replaced MySQL backtick SQL with portable QueryBuilder; use OCP\DB\Types
  • Duplicate notifier: Removed double registration from Application.php boot()
  • API security: Generic error messages instead of raw exception output (SubstituteController, GdprController)
  • PDF export: Returns HTTP 422 with clear message instead of silent CSV fallback
  • LIKE injection: WorkingTimeModelMapper::searchByName() uses escapeLikeParameter()
  • XSS: Modal titles escaped in components.js; compliance-violations.js innerHTML escaped
  • Admin-settings form: Added CSRF requesttoken
  • AbsenceService DI: Fixed constructor argument order (IDBConnection)
  • Admin holidays and settings: English source strings for l10n keys
  • UserDeletedListener: inject TeamMemberMapper and TeamManagerMapper
  • XSS: sanitise team names in admin-teams.js

Changed

  • CSS: Shadow-light variable, scoped resets, dark-mode color-mix fixes, semantic color variables, navigation height/z-index
  • Clock buttons: Double-submit guard (disabled during API calls)
  • initTimeline(): Max retry count (20) to prevent infinite loop
  • Accessibility: aria-label on header buttons, label for admin user search, aria-modal on welcome dialog, English l10n keys in navigation
  • Docs: Removed internal docs; added docs/README; corrected repo URLs
  • Manager dashboard: Injected l10n from PHP so JS translations work
  • Constants.php for magic numbers; user-facing error messages

Added

  • Version1010 migration: Compound indices on at_entries, at_violations, at_holidays, at_absences
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignaturePf3DfgKP/j8T95ElL4ORpuPFeD3UHt901udriCVI1yQdyRJDTp5Z8tHcaFpLRjjmjW8c1nFIEjrFVTjl5UNnPTTWzwf1+Woci/TtIHa7lDkMftxjIIVMf7khRJ6NGriUQD1WVS6Hqdi+FWafgnIqn7dO728K+lB3rFSlgoCoQgQpjjJ/D+N5yynIi44wiD7F8PngozN58wUdWoW02zBX3W+ndpEZXmrY2srqPndhBrlg4cOrE8cWSUFe9wtwSaopkDZPSl85Wsg7nwDOJGV1JaFzDdBxyHATs3kxJnsntXePI1j/O8bcWR69o45JkDY458TsiA0qweFMx5A3Ioh5K0Rrp4UQREthUP83sEzQCIo9ztzB3oeFr1sAs+/dfauAPLsHWNG3NO70fZ82RnsRKuhklTbL8RQ6gc2a3rqrOLSPypyLsv6+UxyoKwm41cggNl4UnhyUhoa33IjBiEoZDXTfB2d+fNZoTXkOYZdDTKcC9bNMc+mo8guNkTxqAYw8Ian0V7vmLs0uBJ9JYyyy5k8AUd+8ijMokWm/2VKPCbDga4mmZevp3KqSpVOqXYBJXmMzJH2Vf+LXZYjRHTScFQ92bXVz7VRRNoz+LEtZy4QYIT9u+YCIvu7ddT5RZmA08HIWU52W/jWQQiKraZE/Nw8Ks4VQBfB6TX+wDCGadBs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.2
Release Details
UpdatedMarch 11, 2026, 11:36 a.m.
Changelog

Changed

  • Long-term refactor: Replaced all \OC::$server usage with proper OCP APIs and constructor injection
  • CSPService: Injected ContentSecurityPolicyNonceManager via constructor
  • Controllers: Removed manual cspNonce (configureCSP handles it); injected IURLGenerator, IConfig where needed
  • PageController: Injected IURLGenerator, IConfig; passes urlGenerator to templates
  • HealthController: Injected IDBConnection for database check
  • ProjectCheckIntegrationService: Injected LoggerInterface instead of OC::$server->getLogger()
  • Templates: Replaced \OC::$server with \OCP\Server::get() (OCP public API)
  • Added GitHub Actions release workflow (.github/workflows/release.yml)
  • Updated PageControllerTest with full constructor mocks
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
SignatureVdOLtKkuJFOvqioRam3iZGmEiSQrA4Xc99thIdm97dMKFlfHskcRIG34rWiqftbbIh+6CgWWxu+YdQOLSV63qOtZ7rH/rl1x5hnhaR4GBDbTtnE/frmfTJYlpHlKVw9KSyniEEAE30lLl5tuYA/4myl+9N6abL+9oJpQo8nAY2oApVgdJQFHPvUPeaJ6q0Qb6GUkOTwZo/UgmT0cIqTL7Ymkvkp3OGE1nRr2hD+T5aFyXu0E3IfS5m+eete4Xdn5TcSYzWVB3oBdMxmRTUtracW4ar/ZstAIwsVxmrLcW4/2AgvUQrrAZ87EBNNoiekUF+nJogWpFeh1n6lN7ZbuUSQJaQtlquovukPbnOgO1AAFe3EMG2DmBtlbyn/jt8/DY5ql8VTDp62eKDJxYTodidjAQYkqMEve7XuTtPgrNwG9c4hFNYS5fIGz07ER4otxErRKC25d89ql/bkSDre0IZPw/gTgdEjx71iD/UZBf9b2tzhMKpNfdtlkT0BV1mNOa376kZzYOk9DcpAaOgobPK00gb3ZeeODGn29N8LEvEAI5SCoa1m7eT4B0KbMQNtgDEUNZrrvRf3Tzpb0mL2QUmf5i3sn10IjQ6KdTDor1xWFEYIF03M240Dw5ml/UUrDgvXI9WZ1BzgyNDe2HAVeNPb9akpPHUWYkoe+uOoaf7A=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
ArbeitszeitCheck 1.1.1
Release Details
UpdatedMarch 10, 2026, 10:18 p.m.
Changelog

Fixed

  • Resolved duplicate route names in absence API (absence#store, absence#show, absence#update, absence#delete)
  • Corrected settings class names in info.xml to use full OCA namespace
  • Added declare(strict_types=1) to routes.php

Changed

  • Removed non-existent screenshot references from info.xml until real screenshots are captured
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhMPMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwMzEwMTIwNDQ1WhcNMzYwNjE1MTIwNDQ1WjAbMRkwFwYD
VQQDDBBhcmJlaXRzemVpdGNoZWNrMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEA36f1UVsSAVpJMWTBc3IuCLVx3o3I+F7k9uVZWcg7swgv9RXZcoEqU1/F
s0SsmAa/27dliUZ68Mse/lObGhzUOBwHHG9dhPOJfIDV/8uKs3KiorcwezBjDHIM
s5PZM7ctDBd8VNid2tbIJ+YFJiyYoI4i7adOCoHCVGi5Imhi7IyyujcVH/gbxE+G
dyq3eebXh5gtrLwJTd9emekdJ4ZzwqccCDllPu+bQrpX9rhX0uZpcK4y4VElHPdd
lFv2VTotgovqTvRFTpyxgfeJI5qvQ6okq6RNRUmPJ7tk6Zy9bzOYP1DEkb2jsIGX
IT5Sc60sz33pso2VFnX37A5j3gULwfgMrA9jMlRgfvFq/gxgGKwv4xTqMcKdROUr
emgDDSAOq9DmChtFskw/0KgndaxgfpxKiC5+H8242gja0j8+pWaYzeOp0qTWWjoE
LJEV++w+krRQDv/LlUoRn8E+mg+svGSlvVDD/DDhqQAGEHrmd5Zm4DqmnJjyaPnc
LA9FJdhor5aD8da8iXMXFxiT8dZsC7CvMS42O3XrEzsbcANp3C4/jdJx7jdZC+lf
c/19I677hewMPomWQGwzFZyrGdQsQykaQYVqJdKOIVpT7HlVrlIZ/FzBPIAR6u+I
g1gY8z+20I8Nl7g9Px/3/RMygomMwzPW6Vl8mUVI1YbsrzoQBP0CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAEPOiRKIE7zPVDVMHs8zw/t/fChrAbSSO69EvdiWft+a1
bwtUM2vwORm3rHUwLLtRHGTCAX5DxzQOzscd0RPpI42D7d0CygC0aq912caAcI48
RuCY5/dbXSnfrAPHo4AWwo5dCbLsM6/FE3OjX8wA6J14P3q6me1IdEmWN1wVFeB7
WUhP3rJizFsOOL9L7PYFCYCCj5n/ZF3PXTeMzaz93lFq/M7xo6+KoFfloChYvctz
t8zYxalL4ExEegIGDkw1bk5MCVoL5E3dMaK8CpzcuDgGRe7z17C5GKRB9021g6Kn
VpcU+y0BR1hn8QEQrFxEkxoONJDCuK0nmvZJpb2TMQ==
-----END CERTIFICATE-----
Signaturec6nuFK9N2O61bf1GpNWz2G2FDt1GzTRzd2pXna6x5E/HI/m1e1dt8TheGnhfgYm/TY/o/W539hak3svOJbJmoJr/kmd7xVWRGnZH/PDBjROe5kwRIwWdZlR3z7DiOyTsZo44DBLvVFEaRMAjF4PpVpJxTIA0xV59d3YJHyFZXbMPxSvAbZu43bAjWU6kVGmfaKUOrW5d592aApbxQ+mwJS7LwFMXlxGSzyCTwYL3bMkwormPPS64RTJtrPhvImU09ACMsjwgERAuFGlvbGj8CiuXzAWoO7ISyxcsqiaw1jnA5OIlJ+hnQhUdYHtkIzdwNHxw4ItSBL3pSJjhwIyrs4zZRMkOVjTqDluDfmvbx3Ir9cglVHlMGGTOOJtuyU0PmL0Fo9HZ2R0Noz9w8T3cpetxRG+B+mSWapUblbM+BT6aIvfHMjSzvI0qjwzcczwVzkYJISHReObwYFpeVs5W7cW1gXY2mx42Q/fPqDkrM5wEiuYJ98QG7Y67uhYZce9wmAp0Pygx0UJILj4fNPLuA27hVOp3++x0rOxhEl1A4v0tgiX5pVRYK3qwf1vHFl3zSGgldQs2WUmJ6CoPWbIE6hzmtRUGMzSOnKEK+2eLHej/Edzdo75nVZd6maKXVAY1L+z74IK61HvJ6kQ0QXFO7urWBZJg+IfxzR6W4mrvZnY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<37.0.0
Minimum Integer bits32