diff --git a/.license-overrides.json b/.license-overrides.json index 7dec2249..0209972b 100644 --- a/.license-overrides.json +++ b/.license-overrides.json @@ -1,3 +1,5 @@ { - "@fortawesome/free-solid-svg-icons": "License is (CC-BY-4.0 AND MIT) — both are approved open-source licenses, compound AND expression not parsed by checker" + "@fortawesome/free-solid-svg-icons": "License is (CC-BY-4.0 AND MIT) — both are approved open-source licenses, compound AND expression not parsed by checker", + "pako": "License is (MIT AND Zlib) — both are approved open-source licenses, compound AND expression not parsed by checker", + "sha.js": "License is (MIT AND BSD-3-Clause) — both are approved open-source licenses, compound AND expression not parsed by checker" } diff --git a/docs/features.json b/docs/features.json new file mode 100644 index 00000000..a1d59ab0 --- /dev/null +++ b/docs/features.json @@ -0,0 +1,8 @@ +[ + { + "slug": "org-archimate-export", + "title": "Organization-Specific ArchiMate Export", + "summary": "Defines how the softwarecatalog app exports an organization-enriched ArchiMate (AMEFF) XML file that includes the base GEMMA model plus the organization's applications plotted on referentiecomponenten, with proper folder structure, naming, and metadata. Supports toggling data layers (modules, deelnames, gebruik) via query parameters and organises output into typed folders. The exported file is designed to import cleanly into Archi (the open-source ArchiMate modelling tool) and other AMEFF-compatible tools.", + "docsUrl": "openspec/specs/org-archimate-export/spec.md" + } +] diff --git a/lib/BackgroundJob/CronjobContextTrait.php b/lib/BackgroundJob/CronjobContextTrait.php index 2267c69b..6918ac8e 100644 --- a/lib/BackgroundJob/CronjobContextTrait.php +++ b/lib/BackgroundJob/CronjobContextTrait.php @@ -73,7 +73,7 @@ trait CronjobContextTrait * @param string $jobId The identifier of the cronjob (e.g., 'organization_contact_sync') * * @return bool True if context was successfully set, false otherwise - * @spec openspec/changes/retrofit-2026-05-26-cronjob-context/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-cronjob-context/tasks.md#task-1 */ protected function setCronjobContext(string $jobId): bool { @@ -184,7 +184,7 @@ protected function setCronjobContext(string $jobId): bool * @param string $jobId The identifier of the cronjob * * @return void - * @spec openspec/changes/retrofit-2026-05-26-cronjob-context/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-cronjob-context/tasks.md#task-1 */ protected function clearCronjobContext(string $jobId): void { diff --git a/lib/BackgroundJob/OrganizationContactSyncJob.php b/lib/BackgroundJob/OrganizationContactSyncJob.php index 2b3ace0b..48e83058 100644 --- a/lib/BackgroundJob/OrganizationContactSyncJob.php +++ b/lib/BackgroundJob/OrganizationContactSyncJob.php @@ -78,7 +78,7 @@ public function __construct( * @return void * * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * @spec openspec/changes/retrofit-2026-05-26-cronjob-context/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-cronjob-context/tasks.md#task-2 */ protected function run($argument): void { diff --git a/lib/Controller/AangebodenGebruikController.php b/lib/Controller/AangebodenGebruikController.php index 8482a748..9a0fecd3 100644 --- a/lib/Controller/AangebodenGebruikController.php +++ b/lib/Controller/AangebodenGebruikController.php @@ -22,6 +22,7 @@ use OCP\AppFramework\Controller; use OCP\AppFramework\Http\JSONResponse; +use OCP\IGroupManager; use OCP\IRequest; use OCP\IUserSession; use OCA\SoftwareCatalog\Service\AangebodenGebruikService; @@ -50,18 +51,20 @@ class AangebodenGebruikController extends Controller /** * Constructor for AangebodenGebruikController. * - * @param string $appName The name of the app - * @param IRequest $request The HTTP request object - * @param IUserSession $userSession The user session service for getting the current user - * @param AangebodenGebruikService $gebruikSvc The business logic service - * @param LoggerInterface $logger The logger service for debugging and error reporting + * @param string $appName The name of the app + * @param IRequest $request The HTTP request object + * @param IUserSession $userSession The user session service for getting the current user + * @param AangebodenGebruikService $gebruikSvc The business logic service + * @param LoggerInterface $logger The logger service for debugging and error reporting + * @param IGroupManager $groupManager The group manager for group membership checks */ public function __construct( string $appName, IRequest $request, private readonly IUserSession $userSession, private readonly AangebodenGebruikService $gebruikSvc, - private readonly LoggerInterface $logger + private readonly LoggerInterface $logger, + private readonly IGroupManager $groupManager ) { parent::__construct(appName: $appName, request: $request); }//end __construct() @@ -85,7 +88,7 @@ public function __construct( * @NoCSRFRequired * @PublicPage * @PublicPage - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getGebruiksWhereAfnemer(): JSONResponse { @@ -161,7 +164,7 @@ public function getGebruiksWhereAfnemer(): JSONResponse * @NoAdminRequired * @NoCSRFRequired * @PublicPage - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getKoppelingenGebruikByUuid(string $uuid): JSONResponse { @@ -252,7 +255,7 @@ public function getKoppelingenGebruikByUuid(string $uuid): JSONResponse * @NoAdminRequired * @NoCSRFRequired * @PublicPage - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getAllGebruiksForAmbtenaar(): JSONResponse { @@ -360,7 +363,7 @@ public function getAllGebruiksForAmbtenaar(): JSONResponse * @PublicPage * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getSingleGebruikForAmbtenaar(string $gebruikId): JSONResponse { @@ -481,8 +484,7 @@ private function isUserInGroup(string $groupName): bool return false; } - $userId = $user->getUID(); - $groupManager = \OC::$server->getGroupManager(); + $userId = $user->getUID(); $group = $groupManager->get($groupName); if ($group === null) { @@ -533,7 +535,7 @@ private function isUserInGroup(string $groupName): bool * @NoCSRFRequired * @PublicPage * @PublicPage - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getGebruiksWhereDeelnemers(): JSONResponse { @@ -612,7 +614,7 @@ public function getGebruiksWhereDeelnemers(): JSONResponse * @NoCSRFRequired * @PublicPage * @PublicPage - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-2 */ public function setGebruikSelfToActiveOrg(string $gebruikId): JSONResponse { @@ -720,7 +722,7 @@ function ($key) { * @NoCSRFRequired * @PublicPage * @PublicPage - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-2 */ public function deleteGebruikAsAfnemer(string $gebruikId): JSONResponse { @@ -821,7 +823,7 @@ function ($key) { * @PublicPage * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-3 */ public function getApiDocumentation(): JSONResponse { diff --git a/lib/Controller/ContactpersonenController.php b/lib/Controller/ContactpersonenController.php index bbff6428..5e29a918 100644 --- a/lib/Controller/ContactpersonenController.php +++ b/lib/Controller/ContactpersonenController.php @@ -169,7 +169,7 @@ public function __construct( * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 */ public function getContactpersonen(string $organisationId): JSONResponse { @@ -265,7 +265,7 @@ function ($group) { * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-2 */ public function convertToUser(string $contactpersoonId): JSONResponse { @@ -491,7 +491,7 @@ public function convertToUser(string $contactpersoonId): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 */ public function changePassword(string $username, string $newPassword): JSONResponse { @@ -580,7 +580,7 @@ public function changePassword(string $username, string $newPassword): JSONRespo * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 */ public function updateUserGroups(string $username, array $groups=[]): JSONResponse { @@ -704,7 +704,7 @@ function ($group) { * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 */ public function getContactPersonsWithUserDetailsForOrganization(string $organizationUuid): JSONResponse { @@ -796,7 +796,7 @@ public function getContactPersonsWithUserDetailsForOrganization(string $organiza * @NoCSRFRequired * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 */ public function getUserInfo(string $contactpersoonId): JSONResponse { @@ -923,7 +923,7 @@ public function getUserInfo(string $contactpersoonId): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 */ public function getAvailableGroups(): JSONResponse { @@ -988,7 +988,7 @@ public function getAvailableGroups(): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 */ public function disableUser(string $contactpersoonId): JSONResponse { @@ -1036,7 +1036,7 @@ public function disableUser(string $contactpersoonId): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-3 */ public function enableUser(string $contactpersoonId): JSONResponse { @@ -1082,7 +1082,7 @@ public function enableUser(string $contactpersoonId): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 */ public function testBulkUserInfo(): JSONResponse { @@ -1143,7 +1143,7 @@ public function testBulkUserInfo(): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 */ public function getBulkUserInfo(): JSONResponse { @@ -1209,7 +1209,7 @@ public function getBulkUserInfo(): JSONResponse * @NoCSRFRequired * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-contactpersonen-api/tasks.md#task-1 */ public function getMe(): JSONResponse { diff --git a/lib/Controller/DashboardController.php b/lib/Controller/DashboardController.php index 56cfe2a3..42caddb7 100644 --- a/lib/Controller/DashboardController.php +++ b/lib/Controller/DashboardController.php @@ -43,7 +43,7 @@ public function __construct($appName, IRequest $request) * @NoCSRFRequired * * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-1 */ public function page(?string $getParameter): TemplateResponse { @@ -76,7 +76,7 @@ public function page(?string $getParameter): TemplateResponse * @NoCSRFRequired * * @return JSONResponse The JSON response with empty results - * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-1 */ public function index(): JSONResponse { diff --git a/lib/Controller/GebruikController.php b/lib/Controller/GebruikController.php index 61cb2ead..c3442bc5 100644 --- a/lib/Controller/GebruikController.php +++ b/lib/Controller/GebruikController.php @@ -6,13 +6,13 @@ * Handles HTTP requests for view-related operations including querying views * with enrichment options for products and usage data. * - * @category Controller - * @package OCA\SoftwareCatalog\Controller - * @author Conduction b.v. + * @category Controller + * @package OCA\SoftwareCatalog\Controller + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * @version GIT: - * @link https://github.com/nextcloud/softwarecatalog + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @version GIT: + * @link https://github.com/nextcloud/softwarecatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-10 */ @@ -35,13 +35,13 @@ * This controller provides REST API endpoints for querying and managing gebruik objects * with role-based access for gebruik-beheerder and aanbod-beheerder users. * - * @category Controller - * @package OCA\SoftwareCatalog\Controller - * @author Conduction b.v. + * @category Controller + * @package OCA\SoftwareCatalog\Controller + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * @version GIT: - * @link https://github.com/nextcloud/softwarecatalog + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @version GIT: + * @link https://github.com/nextcloud/softwarecatalog */ class GebruikController extends Controller { diff --git a/lib/Controller/PreferencesController.php b/lib/Controller/PreferencesController.php index 182a3a87..cfe81665 100644 --- a/lib/Controller/PreferencesController.php +++ b/lib/Controller/PreferencesController.php @@ -62,7 +62,7 @@ public function __construct( * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-3 */ public function getPreference(string $key): JSONResponse { @@ -102,7 +102,7 @@ public function getPreference(string $key): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-3 */ public function setPreference(string $key, string $value=''): JSONResponse { diff --git a/lib/Controller/SettingsController.php b/lib/Controller/SettingsController.php index af041be7..8c918d0f 100644 --- a/lib/Controller/SettingsController.php +++ b/lib/Controller/SettingsController.php @@ -103,7 +103,7 @@ public function __construct( * * @return ObjectService|null The OpenRegister service if available, null otherwise. * @throws RuntimeException If the service is not available. - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-1 */ public function getObjectService(): ?ObjectService { @@ -121,7 +121,7 @@ public function getObjectService(): ?ObjectService * * @return ConfigurationService|null The Configuration service if available, null otherwise. * @throws RuntimeException If the service is not available. - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-1 */ public function getConfigurationService(): ?ConfigurationService { @@ -563,7 +563,7 @@ public function status(): JSONResponse * @return JSONResponse JSON response containing the auto-configuration results * * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 */ public function autoConfigure(): JSONResponse { @@ -665,7 +665,7 @@ public function debug(): JSONResponse * @return JSONResponse * * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function sendTestEmail(): JSONResponse { @@ -887,7 +887,7 @@ public function getVersionInfo(): JSONResponse * @return JSONResponse JSON response containing reset results. * * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 */ public function resetAutoConfig(): JSONResponse { @@ -960,7 +960,7 @@ public function clearCache(): JSONResponse * @return JSONResponse JSON response containing import results. * * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 */ public function manualImport(): JSONResponse { @@ -1018,7 +1018,7 @@ public function manualImport(): JSONResponse * @return JSONResponse JSON response containing force update results. * * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 */ public function forceUpdate(): JSONResponse { @@ -1091,7 +1091,7 @@ public function forceUpdate(): JSONResponse * @return JSONResponse JSON response containing consolidated results * * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-2 */ public function consolidatedAutoConfigure(): JSONResponse { @@ -1319,7 +1319,7 @@ public function render(): string * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.Superglobals) - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function importArchiMate(): JSONResponse { @@ -1499,7 +1499,7 @@ public function importArchiMate(): JSONResponse * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function exportArchiMate(): Response { @@ -1618,7 +1618,7 @@ public function render(): string * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function exportOrgArchiMate(string $organizationUuid): Response { @@ -1722,7 +1722,7 @@ public function render(): string * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function downloadArchiMate(string $fileName): Response { @@ -1817,7 +1817,7 @@ public function downloadArchiMate(string $fileName): Response * @NoCSRFRequired * * @return JSONResponse Test connection result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function testEmailConnection(): JSONResponse { @@ -1879,7 +1879,7 @@ public function testEmailConnection(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Current email settings - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function getEmailSettings(): JSONResponse { @@ -1916,7 +1916,7 @@ public function getEmailSettings(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function updateEmailSettings(): JSONResponse { @@ -1962,7 +1962,7 @@ public function updateEmailSettings(): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function getEmailTemplates(): JSONResponse { @@ -2002,7 +2002,7 @@ public function getEmailTemplates(): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function getEmailTemplate(string $templateName): JSONResponse { @@ -2042,7 +2042,7 @@ public function getEmailTemplate(string $templateName): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function updateEmailTemplate(string $templateName): JSONResponse { @@ -2102,7 +2102,7 @@ public function updateEmailTemplate(string $templateName): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function getEmailTemplateDefault(string $templateName): JSONResponse { @@ -2142,7 +2142,7 @@ public function getEmailTemplateDefault(string $templateName): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function getEmailTemplateVariables(string $templateName): JSONResponse { @@ -2184,7 +2184,7 @@ public function getEmailTemplateVariables(string $templateName): JSONResponse * @NoCSRFRequired * * @return JSONResponse Generic user groups - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getGenericUserGroups(): JSONResponse { @@ -2221,7 +2221,7 @@ public function getGenericUserGroups(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function setGenericUserGroups(): JSONResponse { @@ -2264,7 +2264,7 @@ public function setGenericUserGroups(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Organization admin groups - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getOrganizationAdminGroups(): JSONResponse { @@ -2301,7 +2301,7 @@ public function getOrganizationAdminGroups(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function setOrganizationAdminGroups(): JSONResponse { @@ -2344,7 +2344,7 @@ public function setOrganizationAdminGroups(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Super user groups - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getSuperUserGroups(): JSONResponse { @@ -2381,7 +2381,7 @@ public function getSuperUserGroups(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function setSuperUserGroups(): JSONResponse { @@ -2424,7 +2424,7 @@ public function setSuperUserGroups(): JSONResponse * @NoCSRFRequired * * @return JSONResponse All user groups - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getAllGroups(): JSONResponse { @@ -2465,7 +2465,7 @@ public function getAllGroups(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Clear result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function clearArchiMateImportStatus(): JSONResponse { @@ -2505,7 +2505,7 @@ public function clearArchiMateImportStatus(): JSONResponse * * @NoAdminRequired * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function killArchiMateImport(): JSONResponse { @@ -2544,7 +2544,7 @@ public function killArchiMateImport(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Cancellation result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function cancelArchiMateImport(): JSONResponse { @@ -2586,7 +2586,7 @@ public function cancelArchiMateImport(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Clear result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function clearArchiMateExportStatus(): JSONResponse { @@ -2627,7 +2627,7 @@ public function clearArchiMateExportStatus(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Round-trip test result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function testArchiMateRoundTrip(): JSONResponse { @@ -2678,7 +2678,7 @@ public function testArchiMateRoundTrip(): JSONResponse * @NoCSRFRequired * * @return JSONResponse ArchiMate settings and status - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getArchiMateSettings(): JSONResponse { @@ -2716,7 +2716,7 @@ public function getArchiMateSettings(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Object counts for all registers - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-3 */ public function getObjectCounts(): JSONResponse { @@ -2757,7 +2757,7 @@ public function getObjectCounts(): JSONResponse * @NoCSRFRequired * * @return JSONResponse ArchiMate configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getArchiMateConfig(): JSONResponse { @@ -2788,7 +2788,7 @@ public function getArchiMateConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function updateArchiMateConfig(): JSONResponse { @@ -2821,7 +2821,7 @@ public function updateArchiMateConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Email configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function getEmailConfig(): JSONResponse { @@ -2852,7 +2852,7 @@ public function getEmailConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function updateEmailConfig(): JSONResponse { @@ -2885,7 +2885,7 @@ public function updateEmailConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse AMEF configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function getAmefConfig(): JSONResponse { @@ -2916,7 +2916,7 @@ public function getAmefConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-4 */ public function updateAmefConfig(): JSONResponse { @@ -2949,7 +2949,7 @@ public function updateAmefConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Voorzieningen configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-1 */ public function getVoorzieningenConfig(): JSONResponse { @@ -2980,7 +2980,7 @@ public function getVoorzieningenConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-1 */ public function updateVoorzieningenConfig(): JSONResponse { @@ -3013,7 +3013,7 @@ public function updateVoorzieningenConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Object counts - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-3 */ public function getObjectsCounts(): JSONResponse { @@ -3045,7 +3045,7 @@ public function getObjectsCounts(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Object statistics - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-3 */ public function getObjectsStatistics(): JSONResponse { @@ -3077,7 +3077,7 @@ public function getObjectsStatistics(): JSONResponse * @NoCSRFRequired * * @return JSONResponse User groups configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getUserGroupsConfig(): JSONResponse { @@ -3108,7 +3108,7 @@ public function getUserGroupsConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function updateUserGroupsConfig(): JSONResponse { @@ -3265,7 +3265,7 @@ public function syncOrganisations(): JSONResponse * @return JSONResponse Response containing sync results. * * @NoCSRFRequired - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-3 */ public function bulkSyncStandards(): JSONResponse { @@ -3327,7 +3327,7 @@ public function bulkSyncStandards(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Cronjob configurations - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getCronjobConfig(): JSONResponse { @@ -3359,7 +3359,7 @@ public function getCronjobConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse Update result - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function updateCronjobConfig(): JSONResponse { @@ -3399,7 +3399,7 @@ public function updateCronjobConfig(): JSONResponse * @NoCSRFRequired * * @return JSONResponse List of available users - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getCronjobUsers(): JSONResponse { @@ -3433,7 +3433,7 @@ public function getCronjobUsers(): JSONResponse * @NoCSRFRequired * * @return JSONResponse List of available organisations - * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-admin-controller/tasks.md#task-5 */ public function getCronjobOrganisations(): JSONResponse { diff --git a/lib/Controller/ViewController.php b/lib/Controller/ViewController.php index 4190125e..0d677532 100644 --- a/lib/Controller/ViewController.php +++ b/lib/Controller/ViewController.php @@ -6,13 +6,13 @@ * Handles HTTP requests for view-related operations including querying views * with enrichment options for products and usage data. * - * @category Controller - * @package OCA\SoftwareCatalog\Controller - * @author Conduction b.v. + * @category Controller + * @package OCA\SoftwareCatalog\Controller + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * @version GIT: - * @link https://github.com/nextcloud/softwarecatalog + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @version GIT: + * @link https://github.com/nextcloud/softwarecatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-10 */ @@ -31,13 +31,13 @@ * This controller provides REST API endpoints for querying and managing ArchiMate views * with optional enrichment capabilities for products, usage data (gebruik), and related information. * - * @category Controller - * @package OCA\SoftwareCatalog\Controller - * @author Conduction b.v. + * @category Controller + * @package OCA\SoftwareCatalog\Controller + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * @version GIT: - * @link https://github.com/nextcloud/softwarecatalog + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @version GIT: + * @link https://github.com/nextcloud/softwarecatalog */ class ViewController extends Controller { @@ -312,7 +312,7 @@ private function parseBooleanParam($value): bool * @return JSONResponse JSON response with API documentation * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-2 */ public function getApiDocumentation(): JSONResponse { diff --git a/lib/Repair/InitializeSettings.php b/lib/Repair/InitializeSettings.php index 453f8a87..8d762f67 100644 --- a/lib/Repair/InitializeSettings.php +++ b/lib/Repair/InitializeSettings.php @@ -66,7 +66,7 @@ public function getName(): string * @param IOutput $output The output interface for progress reporting * * @return void - * @spec openspec/changes/retrofit-2026-05-26-repair-init/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-repair-init/tasks.md#task-1 */ public function run(IOutput $output): void { diff --git a/lib/Service/AangebodenGebruikService.php b/lib/Service/AangebodenGebruikService.php index dddf1a40..0c3efc39 100644 --- a/lib/Service/AangebodenGebruikService.php +++ b/lib/Service/AangebodenGebruikService.php @@ -91,7 +91,7 @@ public function __construct( * @return array Array with success status, objects data, and metadata. * * @throws Exception When OpenRegister service is not available. - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getGebruiksWhereAfnemer(array $options=[]): array { @@ -322,7 +322,7 @@ public function getGebruiksWhereAfnemer(array $options=[]): array * @throws Exception When OpenRegister service is not available. * * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $isAmbtenaar is a simple privilege toggle - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getKoppelingenGebruikByUuid(string $uuid, array $options=[], bool $isAmbtenaar=false): array { @@ -540,7 +540,7 @@ public function getKoppelingenGebruikByUuid(string $uuid, array $options=[], boo * @return array searchObjectsPaginated result with all gebruiks. * * @throws Exception When OpenRegister service is not available. - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getAllGebruiksForAmbtenaar(array $options=[]): array { @@ -641,7 +641,7 @@ public function getAllGebruiksForAmbtenaar(array $options=[]): array * @return array searchObjectsPaginated result with all gebruiks for the suite * * @throws Exception When OpenRegister service is not available - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getSingleGebruikForAmbtenaar(string $suiteId, array $options=[]): array { @@ -760,7 +760,7 @@ public function getSingleGebruikForAmbtenaar(string $suiteId, array $options=[]) * @return array Array with success status, gebruiks data, and metadata * * @throws Exception When OpenRegister service is not available - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-1 */ public function getGebruiksWhereDeelnemers(array $options=[]): array { @@ -883,7 +883,7 @@ public function getGebruiksWhereDeelnemers(array $options=[]): array * @return array Result with success status and updated object data * * @throws Exception When OpenRegister service is not available or operation fails - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-2 */ public function setGebruikSelfToActiveOrg(string $gebruikId, array $options=[]): array { @@ -1675,7 +1675,7 @@ private function addQueryFilters(array $baseQuery, array $options): array * @param array $options Additional options for the operation * * @return array Result array with success status and details - * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-aangeboden-gebruik-api/tasks.md#task-2 */ public function deleteGebruikAsAfnemer(string $gebruikId, array $options=[]): array { diff --git a/lib/Service/ArchiMateExportService.php b/lib/Service/ArchiMateExportService.php index 9ddfcff4..caf51e8d 100644 --- a/lib/Service/ArchiMateExportService.php +++ b/lib/Service/ArchiMateExportService.php @@ -2,12 +2,12 @@ /** * ArchiMate Export Service. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * @link https://conduction.nl + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @link https://conduction.nl * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-5 */ @@ -15,12 +15,12 @@ /** * ArchiMate Export Service for the SoftwareCatalog app * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @link https://github.com/ConductionNL/SoftwareCatalog */ declare(strict_types=1); @@ -80,7 +80,7 @@ public function __construct( * @param \SimpleXMLElement $xml The XML element to populate. * * @return \SimpleXMLElement The populated XML element. - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 */ public function arrayToXml(array $data, \SimpleXMLElement $xml): \SimpleXMLElement { @@ -399,7 +399,7 @@ public function createCleanArchiMateXml(array $modelMetadata): \SimpleXMLElement * @param string $childTagName Tag name for child elements. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 */ public function addObjectsToXml( \SimpleXMLElement $xml, @@ -452,7 +452,7 @@ public function addElementsToXml(\SimpleXMLElement $xml, array $elements): void * @param array $relationships The relationships to add. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 */ public function addRelationshipsToXml(\SimpleXMLElement $xml, array $relationships): void { @@ -473,7 +473,7 @@ public function addRelationshipsToXml(\SimpleXMLElement $xml, array $relationshi * @param array $views The views to add. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 */ public function addViewsToXml(\SimpleXMLElement $xml, array $views): void { @@ -507,7 +507,7 @@ public function addViewsToXml(\SimpleXMLElement $xml, array $views): void * @param array $organizations The organizations to add. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 */ public function addOrganizationsToXml(\SimpleXMLElement $xml, array $organizations): void { @@ -772,7 +772,7 @@ private function addObjectToFolder(\SimpleXMLElement $folder, array $object, str * @return array Array of objects from all schemas in the register. * * @throws \RuntimeException If retrieval fails. - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 */ public function getObjectsFromDatabase( \OCA\OpenRegister\Service\ObjectService $objectService, @@ -887,7 +887,7 @@ public function getObjectsFromDatabase( * @param array $propertyDefinitions The property definitions. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 */ public function addPropertyDefinitionsToXml(\SimpleXMLElement $xml, array $propertyDefinitions): void { @@ -916,7 +916,7 @@ public function addPropertyDefinitionsToXml(\SimpleXMLElement $xml, array $prope * @param string|null $organization Organization filter. * * @return string Generated XML. - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 */ public function exportArchiMateXml( \OCA\OpenRegister\Service\ObjectService $objectService, @@ -1958,7 +1958,7 @@ private function addDataToXmlNode(\SimpleXMLElement $node, array $data): void * @param array $schemaIdMap Mapping of schema IDs to schema types. * * @return array ArchiMate data structure. - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-1 */ public function convertFromOpenRegisterObjects(array $objects, array $schemaIdMap): array { @@ -2389,7 +2389,7 @@ private function validateTextContentNormalized(\SimpleXMLElement $xml): void * @param array $options Export options. * * @return string Generated XML. - * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-archimate-export/tasks.md#task-2 */ public function exportOrganizationArchiMateXml( \OCA\OpenRegister\Service\ObjectService $objectService, diff --git a/lib/Service/ArchiMateImportService.php b/lib/Service/ArchiMateImportService.php index e6aa22c2..f19fa96c 100644 --- a/lib/Service/ArchiMateImportService.php +++ b/lib/Service/ArchiMateImportService.php @@ -6,12 +6,12 @@ * Handles the business logic for importing ArchiMate XML files with round-trip fidelity. * This service contains all the import-specific logic that was previously in ArchiMateService. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author SoftwareCatalog Team + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author SoftwareCatalog Team * @copyright 2024 Conduction B.V. - * @license AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html - * @link https://github.com/nextcloud/softwarecatalog + * @license AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html + * @link https://github.com/nextcloud/softwarecatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-5 */ @@ -41,12 +41,12 @@ * 4. Convert to OpenRegister objects with proper @self structure * 5. Save objects using ObjectService::saveObjects * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author SoftwareCatalog Team + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author SoftwareCatalog Team * @copyright 2024 Conduction B.V. - * @license AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html - * @link https://github.com/nextcloud/softwarecatalog + * @license AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html + * @link https://github.com/nextcloud/softwarecatalog * * @SuppressWarnings(PHPMD.ExcessiveClassLength) * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) @@ -196,7 +196,7 @@ public function __construct( * @param \SimpleXMLElement $xml The XML element to convert. * * @return array The normalized associative array. - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-1 */ public function xmlToArray(\SimpleXMLElement $xml): array { @@ -309,7 +309,7 @@ private function isAssoc(mixed $value): bool * @param array $options Import options including file_path, fileName, etc. * * @return array Import results with detailed status - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-1 */ public function importArchiMateFileFromPathOptimized(array $options=[]): array { @@ -1924,7 +1924,7 @@ private function getCurrentOrganisation(): string * Get AMEF configuration from app config * * @return array AMEF configuration - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-1 */ public function getAmefConfig(): array { @@ -2199,7 +2199,7 @@ private function extractPropertyDefinitionMap(array $data): array * @param array $propDefMap The original property definition map * * @return array Mapping of original names to camelCase names - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-1 */ public function getPropertyNameMapping(array $propDefMap): array { diff --git a/lib/Service/ArchiMateService.php b/lib/Service/ArchiMateService.php index 60e6f7dd..299be980 100644 --- a/lib/Service/ArchiMateService.php +++ b/lib/Service/ArchiMateService.php @@ -7,12 +7,12 @@ * Stores complete XML data as JSON blobs in the database and reconstructs * exact XML output during export. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author SoftwareCatalog Team + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author SoftwareCatalog Team * @copyright 2024 Conduction B.V. - * @license AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html - * @link https://github.com/nextcloud/softwarecatalog + * @license AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html + * @link https://github.com/nextcloud/softwarecatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-5 */ @@ -39,12 +39,12 @@ * 2. Storage: Use ObjectService::saveObjects with proper @self structure * 3. Export: Reconstruct exact XML from stored JSON blobs * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author SoftwareCatalog Team + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author SoftwareCatalog Team * @copyright 2024 Conduction B.V. - * @license AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html - * @link https://github.com/nextcloud/softwarecatalog + * @license AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.en.html + * @link https://github.com/nextcloud/softwarecatalog * * @SuppressWarnings(PHPMD.ExcessiveClassLength) * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) @@ -194,7 +194,7 @@ public function __construct( * @param array $options Import options including file_path, fileName, etc. * * @return array Import results with detailed status - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 */ public function importArchiMateFileFromPathOptimized(array $options=[]): array { @@ -302,7 +302,7 @@ public function exportToArchiMate(?string $organization=null): array * @param array $options Optional export options. * * @return array Export results with 'success', 'xml', 'file_name' - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 */ public function exportOrgArchiMate(string $organizationUuid, array $options=[]): array { @@ -1485,7 +1485,7 @@ private function getSchemaIdForSection(string $section): int * Test round-trip functionality * * @return array Test results - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 */ public function testRoundTrip(): array { @@ -1589,7 +1589,7 @@ private function createTempFile(string $content): string * Get AMEF configuration from app config * * @return array AMEF configuration - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 */ public function getAmefConfig(): array { @@ -1692,7 +1692,7 @@ private function getVoorzieningenConfig(): array * Get the current status of ArchiMate operations * * @return array Status information including import/export status and object counts - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 */ public function getArchiMateStatus(): array { @@ -2013,7 +2013,7 @@ private function getObjectsWithPagination(string $schemaType, array $query=[]): * Check if import is in progress * * @return bool True if import is in progress - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 */ public function isImportInProgress(): bool { @@ -2025,7 +2025,7 @@ public function isImportInProgress(): bool * Check if export is in progress * * @return bool True if export is in progress - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 */ public function isExportInProgress(): bool { @@ -2767,7 +2767,7 @@ private function convertToCamelCase(string $propertyName): string * @param array $propDefMap The original property definition map * * @return array Mapping of original names to camelCase names - * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-archimate-import/tasks.md#task-2 */ public function getPropertyNameMapping(array $propDefMap): array { diff --git a/lib/Service/ContactpersoonService.php b/lib/Service/ContactpersoonService.php index c17d4b4e..195eb9cf 100644 --- a/lib/Service/ContactpersoonService.php +++ b/lib/Service/ContactpersoonService.php @@ -386,7 +386,7 @@ public function processContactpersoon(object $contactpersoonObject, bool $isUpda * @param string $username The username to update groups for * * @return void - * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-1 */ public function updateUserGroups(object $contactpersoonObject, string $username): void { @@ -413,7 +413,7 @@ public function updateUserGroups(object $contactpersoonObject, string $username) * @param string $username The username being processed * * @return void - * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-1 */ public function ensureOrganizationBeheerder(object $contactpersoonObject, string $username): void { @@ -708,7 +708,7 @@ private function getObjectService(): ?\OCA\OpenRegister\Service\ObjectService * @param object $contactObject The contact object being deleted * * @return void - * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-1 */ public function handleContactDeletion(object $contactObject): void { @@ -778,7 +778,7 @@ public function handleContactDeletion(object $contactObject): void * @param string $organizationUuid The organization UUID * * @return array Array of contact person objects - * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 */ public function getContactPersonsForOrganization(string $organizationUuid): array { @@ -838,7 +838,7 @@ public function getContactPersonsForOrganization(string $organizationUuid): arra * @return array Array of contact person objects with user details spliced in * * @throws \Exception If contact person retrieval fails - * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 */ public function getContactPersonsWithUserDetailsForOrganization(string $organizationUuid): array { @@ -994,7 +994,7 @@ static function ($cp) { * @return array Array of user information keyed by contact person ID * * @throws \Exception If bulk user info retrieval fails - * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 */ public function getBulkUserInfo(array $contactpersoonIds): array { @@ -1268,7 +1268,7 @@ private function updateContactpersoonObjectOwner(object $contactObject, string $ * @return void * * @throws \Exception If enabling fails. - * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 */ public function enableUserForContactpersoon(string $contactpersoonId): void { @@ -1340,7 +1340,7 @@ public function enableUserForContactpersoon(string $contactpersoonId): void * @return void * * @throws \Exception If disabling fails. - * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-contactpersoon-sync/tasks.md#task-2 */ public function disableUserForContactpersoon(string $contactpersoonId): void { diff --git a/lib/Service/OrganisatieService.php b/lib/Service/OrganisatieService.php index 7aaeb429..b8cedde1 100644 --- a/lib/Service/OrganisatieService.php +++ b/lib/Service/OrganisatieService.php @@ -266,8 +266,7 @@ private function mapStatus(string $status): bool * @param string $organizationUuid The organization UUID * * @return \OCA\OpenRegister\Db\Organisation The created organisation entity - */ - /** + * * @spec openspec/changes/retrofit-2026-05-24-organisatie-service/tasks.md#task-1 */ private function createOrganisationEntityInternal( diff --git a/lib/Service/OrganizationSyncService.php b/lib/Service/OrganizationSyncService.php index 45cd3416..7dd9b4ce 100644 --- a/lib/Service/OrganizationSyncService.php +++ b/lib/Service/OrganizationSyncService.php @@ -344,7 +344,7 @@ public function performOrganizationsSync(int $batchSize=50, int $maxExecutionSec * @param int $maxExecutionSeconds The maximum execution time in seconds. * * @return array The sync statistics. - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 */ public function performContactSync(int $batchSize=100, int $maxExecutionSeconds=30): array { @@ -473,7 +473,7 @@ public function performContactSync(int $batchSize=100, int $maxExecutionSeconds= * @return array The sync statistics. * * @psalm-suppress UndefinedClass - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 */ public function performUserSync(): array { @@ -813,7 +813,7 @@ private function processOrganisatieObject( * @return object|null The organisation entity or null on failure. * * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $sendEmails is a simple notification toggle - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-2 */ public function ensureOrganisationEntityPublic(object $organisatieObject, array &$stats, bool $sendEmails=true): ?object { @@ -1381,7 +1381,7 @@ private function getAdminUsers(): array * @param int $minutesBack Number of minutes to look back for prediction (default: 10 for scheduled sync) * * @return array Status information about sync requirements including processing predictions - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-3 */ public function getSyncStatus(int $minutesBack=10): array { @@ -1545,7 +1545,7 @@ private function formatNumber(int $number): string * Records the last sync time * * @return void - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-3 */ public function recordSyncTime(): void { @@ -1562,7 +1562,7 @@ public function recordSyncTime(): void * @param \OCA\OpenRegister\Db\ObjectEntity $organizationObject The organization object to process * * @return array Processing results - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-2 */ public function processSpecificOrganization($organizationObject): array { @@ -2469,7 +2469,7 @@ private function createOrUpdateContactPersonObject( * @param \OCA\OpenRegister\Db\ObjectEntity $contactObject The contact person object to process * * @return array Processing results - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-2 */ public function processSpecificContactPerson($contactObject): array { @@ -2494,7 +2494,10 @@ public function processSpecificContactPerson($contactObject): array ] ); - /** @var array $contactEntityObject */ + /* + * @var array $contactEntityObject + */ + $contactEntityObject = $contactObject->getObject(); // Skip if no organization reference. @@ -2709,7 +2712,7 @@ public function processSpecificContactPerson($contactObject): array * @param int $batchSize Number of items to process per batch (default: 100) * * @return array Comprehensive synchronization results - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 */ public function performOptimizedManualSync(int $maxRounds=10, int $batchSize=100): array { @@ -2808,7 +2811,7 @@ public function performOptimizedManualSync(int $maxRounds=10, int $batchSize=100 * @param int $minutesBack Number of minutes to look back for changes (default: 0 = full sync) * * @return array Synchronization results with detailed logging information - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 */ public function performScheduledSync(int $minutesBack=0): array { @@ -2906,7 +2909,7 @@ public function performScheduledSync(int $minutesBack=0): array * @param int $minutesBack Number of minutes to look back for changes (default: 0 for full sync) * * @return array Synchronization results formatted for API response - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-1 */ public function performManualSync(int $minutesBack=0): array { @@ -2976,7 +2979,7 @@ public function performManualSync(int $minutesBack=0): array * @param int $minutesBack The number of minutes to look back. * * @return array Status information with error handling. - * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-organization-sync/tasks.md#task-3 */ public function getSyncStatusWithErrorHandling(int $minutesBack=10): array { diff --git a/lib/Service/ProgressTracker.php b/lib/Service/ProgressTracker.php index edcfed4e..aa22d5f2 100644 --- a/lib/Service/ProgressTracker.php +++ b/lib/Service/ProgressTracker.php @@ -5,13 +5,13 @@ * Tracks and reports progress for long-running operations like ArchiMate import/export. * Supports real-time streaming via Server-Sent Events. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: 1.0.0 - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: 1.0.0 + * @link https://github.com/ConductionNL/SoftwareCatalog */ declare(strict_types=1); @@ -25,13 +25,13 @@ /** * Service for tracking and reporting progress of long-running operations * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: 1.0.0 - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: 1.0.0 + * @link https://github.com/ConductionNL/SoftwareCatalog */ class ProgressTracker { @@ -433,7 +433,7 @@ private function saveProgress(): void * @param int $maxAge Maximum age in seconds (default: 1 hour) * * @return void - * @spec openspec/changes/retrofit-2026-05-26-progress-tracking-2/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-progress-tracking-2/tasks.md#task-1 */ public function cleanupOldProgress(int $maxAge=3600): void { diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php index 1c2e23e5..a17d07ab 100644 --- a/lib/Service/SettingsService.php +++ b/lib/Service/SettingsService.php @@ -3,13 +3,13 @@ /** * Service for handling settings-related operations in the SoftwareCatalog. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: 1.0.0 - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: 1.0.0 + * @link https://github.com/ConductionNL/SoftwareCatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-4 */ @@ -37,13 +37,13 @@ * Provides functionality for retrieving, saving, and loading settings, * as well as managing configuration for different object types. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: 1.0.0 - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: 1.0.0 + * @link https://github.com/ConductionNL/SoftwareCatalog * * @SuppressWarnings(PHPMD.ExcessiveClassLength) * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) @@ -129,7 +129,7 @@ public function __construct( * @param string|null $minVersion Minimum required version * * @return bool True if OpenRegister is installed and meets version requirements - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 */ public function isOpenRegisterInstalled(?string $minVersion=self::MIN_OPENREGISTER_VERSION): bool { @@ -161,7 +161,7 @@ public function isOpenRegisterEnabled(): bool * @return \OCA\OpenRegister\Service\ObjectService|null The OpenRegister service if available * * @throws \RuntimeException If the service is not available - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 */ public function getObjectService(): ?\OCA\OpenRegister\Service\ObjectService { @@ -176,7 +176,7 @@ public function getObjectService(): ?\OCA\OpenRegister\Service\ObjectService * Get the OpenRegister RegisterService. * * @return \OCA\OpenRegister\Service\RegisterService|null The RegisterService instance or null if not available. - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 */ public function getRegisterService(): ?\OCA\OpenRegister\Service\RegisterService { @@ -193,7 +193,7 @@ public function getRegisterService(): ?\OCA\OpenRegister\Service\RegisterService * @return \OCA\OpenRegister\Service\ConfigurationService|null The Configuration service if available * * @throws \RuntimeException If the service is not available - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 */ public function getConfigurationService(): ?\OCA\OpenRegister\Service\ConfigurationService { @@ -515,7 +515,7 @@ public function autoConfigure(bool $force=false): array * @return array The updated configuration * * @throws \RuntimeException If auto-configuration fails - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function autoConfigureAfterImport(): array { @@ -622,7 +622,7 @@ public function autoConfigureAfterImport(): array * schema and register IDs for pages, menus, and themes from the publication register. * * @return array Configuration result with success status and configured settings - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function configureOpenCatalogi(): array { @@ -762,7 +762,7 @@ private function tableHasData(string $tableName): bool * @param string $objectType The object type (organization, contact, gebruiker, contactpersoon) * * @return int|null The schema ID or null if not configured - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 */ public function getSchemaIdForObjectType(string $objectType): ?int { @@ -920,7 +920,7 @@ public function getSchemaIdForObjectType(string $objectType): ?int * @param string $objectType The object type (organization, contact, gebruiker) * * @return int|null The register ID or null if not configured - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 */ public function getRegisterIdForObjectType(string $objectType): ?int { @@ -987,7 +987,7 @@ public function getRegisterIdForObjectType(string $objectType): ?int * cached values don't become stale. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function clearConfigurationCache(): void { @@ -1009,7 +1009,7 @@ public function clearConfigurationCache(): void * Gets the configured register ID for the voorzieningen register * * @return int|null The register ID or null if not configured - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-1 */ public function getVoorzieningenRegisterId(): ?int { @@ -1124,7 +1124,7 @@ public function getVoorzieningenRegisterId(): ?int * Checks if all required object types are configured * * @return bool True if all object types have schemas configured - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function isFullyConfigured(): bool { @@ -1145,7 +1145,7 @@ public function isFullyConfigured(): bool * Gets configuration status for each object type * * @return array Configuration status information - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function getConfigurationStatus(): array { @@ -1180,7 +1180,7 @@ public function getConfigurationStatus(): array * @param string|null $minOpenRegisterVersion Minimum required OpenRegister version * * @return array The initialization results - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function initialize(?string $minOpenRegisterVersion=self::MIN_OPENREGISTER_VERSION): array { @@ -1365,7 +1365,7 @@ public function initialize(?string $minOpenRegisterVersion=self::MIN_OPENREGISTE * @throws \RuntimeException If settings loading fails * * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $force is a simple re-import toggle - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function loadSettings(bool $force=false): array { @@ -1451,7 +1451,7 @@ public function loadSettings(bool $force=false): array * Gets the list of generic user groups from configuration * * @return array Array of generic user groups - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getGenericUserGroups(): array { @@ -1478,7 +1478,7 @@ public function getGenericUserGroups(): array * @param array $groups Array of generic user groups * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function setGenericUserGroups(array $groups): void { @@ -1497,7 +1497,7 @@ public function setGenericUserGroups(array $groups): void * Gets the list of organization admin groups from configuration * * @return array Array of organization admin groups - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getOrganizationAdminGroups(): array { @@ -1513,7 +1513,7 @@ public function getOrganizationAdminGroups(): array * @param array $groups Array of organization admin groups * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function setOrganizationAdminGroups(array $groups): void { @@ -1532,7 +1532,7 @@ public function setOrganizationAdminGroups(array $groups): void * Gets the list of super user groups from configuration * * @return array Array of super user groups - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getSuperUserGroups(): array { @@ -1559,7 +1559,7 @@ public function getSuperUserGroups(): array * @param array $groups Array of super user groups * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function setSuperUserGroups(array $groups): void { @@ -1580,7 +1580,7 @@ public function setSuperUserGroups(array $groups): void * @param array $groups Array of group names to validate * * @return array Array with validation results - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function validateGroups(array $groups): array { @@ -1616,7 +1616,7 @@ public function validateGroups(array $groups): array * This is the public method that creates user groups and returns status information. * * @return array Results of user group creation and configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function createAndConfigureUserGroups(): array { @@ -1841,7 +1841,7 @@ private function createRequiredUserGroups(): void * Gets all available groups with their information * * @return array Array of group information - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getAllGroups(): array { @@ -1873,7 +1873,7 @@ public function getAllGroups(): array * Gets email configuration settings * * @return array Email settings configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function getEmailSettings(): array { @@ -2048,7 +2048,7 @@ public function getEmailSettings(): array * @param array $emailSettings Email settings to update * * @return array Updated email settings - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function updateEmailSettings(array $emailSettings): array { @@ -2126,7 +2126,7 @@ public function updateEmailSettings(array $emailSettings): array * @param string $templateName The template name (organization_registration, organization_activation, user_creation) * * @return string The template content - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function getEmailTemplate(string $templateName): string { @@ -2143,7 +2143,7 @@ public function getEmailTemplate(string $templateName): string * @param string $templateContent The template content * * @return bool True if update was successful - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function updateEmailTemplate(string $templateName, string $templateContent): bool { @@ -2176,7 +2176,7 @@ public function updateEmailTemplate(string $templateName, string $templateConten * @param string $templateName The template name * * @return string Default template content - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function getDefaultEmailTemplate(string $templateName): string { @@ -2248,7 +2248,7 @@ public function getDefaultEmailTemplate(string $templateName): string * @param string $templateName The template name * * @return array Available template variables - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function getEmailTemplateVariables(string $templateName): array { @@ -2287,7 +2287,7 @@ public function getEmailTemplateVariables(string $templateName): array * Gets debug information for settings * * @return array Debug information - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getDebugInfo(): array { @@ -2371,7 +2371,7 @@ public function getDebugInfo(): array * @param array $emailSettings The email settings to use * * @return array Result of the test email - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function sendTestEmail(string $email, array $emailSettings=[]): array { @@ -2518,7 +2518,7 @@ public function sendTestEmail(string $email, array $emailSettings=[]): array * @param array $emailSettings The email settings to test * * @return array Result of the connection test - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function testEmailConnection(array $emailSettings=[]): array { @@ -2956,7 +2956,7 @@ private function shouldLoadSettings(): bool * * @return array Version information with app and configuration versions. * @throws \RuntimeException If version retrieval fails. - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getVersionInfo(): array { @@ -3041,7 +3041,7 @@ public function getVersionInfo(): array * flags and configurations, then performs import and auto-configuration. * * @return array The force update results - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function forceUpdate(): array { @@ -3128,7 +3128,7 @@ public function forceUpdate(): array * @return array The reset results * * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $resetConfiguration is a simple scope toggle - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function resetAutoConfiguration(bool $resetConfiguration=false): array { @@ -3202,7 +3202,7 @@ public function resetAutoConfiguration(bool $resetConfiguration=false): array * @return array The import results with success/error information. * * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $forceImport is a simple re-import toggle - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function manualImport(bool $forceImport=false): array { @@ -3341,7 +3341,7 @@ public function manualImport(bool $forceImport=false): array * @return array Consolidated configuration results * * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $force is a simple re-import toggle - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function performConsolidatedAutoConfiguration(bool $force=false): array { @@ -3916,7 +3916,7 @@ private function addStepResult(array &$results, array $stepResult, string $stepN * Get consolidated configuration as JSON objects * * @return array The consolidated configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function getConsolidatedConfiguration(): array { @@ -3950,7 +3950,7 @@ public function getConsolidatedConfiguration(): array * Get Voorzieningen configuration as JSON object * * @return array The voorzieningen configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function getVoorzieningenConfig(): array { @@ -3989,7 +3989,7 @@ public function getVoorzieningenConfig(): array * @param array $config The voorzieningen configuration. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function setVoorzieningenConfig(array $config): void { @@ -4064,7 +4064,7 @@ private function normalizeVoorzieningenConfig(array $input): array * to ensure consistency and avoid code duplication. * * @return array The AMEF configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function getAmefConfig(): array { @@ -4137,7 +4137,7 @@ public function getAmefConfig(): array * @param array $config The AMEF configuration. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function setAmefConfig(array $config): void { @@ -4160,7 +4160,7 @@ public function setAmefConfig(array $config): void * Get Email configuration as JSON object * * @return array The email configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function getEmailConfig(): array { @@ -4193,7 +4193,7 @@ public function getEmailConfig(): array * @param array $config The email configuration. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function setEmailConfig(array $config): void { @@ -4211,7 +4211,7 @@ public function setEmailConfig(array $config): void * and ensure consistency in ArchiMate status management. * * @return array The ArchiMate status with object counts - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getArchiMateStatus(): array { @@ -4449,7 +4449,7 @@ private function getAmefObjectCounts(): array * @param array $status The import status. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function setArchiMateImportStatus(array $status): void { @@ -4482,7 +4482,7 @@ public function setArchiMateImportStatus(array $status): void * @param array $status The export status. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function setArchiMateExportStatus(array $status): void { @@ -4513,7 +4513,7 @@ public function setArchiMateExportStatus(array $status): void * and ensure consistency in ArchiMate status management. * * @return array Clear operation result - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function clearArchiMateImportStatus(): array { @@ -4552,7 +4552,7 @@ public function clearArchiMateImportStatus(): array * * @return array Kill operation result * @deprecated Use cancelArchiMateImport() instead - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function killArchiMateImport(): array { @@ -4591,7 +4591,7 @@ public function killArchiMateImport(): array * import cancellation. It delegates to ArchiMateService for the actual work. * * @return array Cancellation result with detailed status - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function cancelArchiMateImport(): array { @@ -4631,7 +4631,7 @@ public function cancelArchiMateImport(): array * and ensure consistency in ArchiMate status management. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function clearArchiMateExportStatus(): void { @@ -4659,7 +4659,7 @@ public function clearArchiMateExportStatus(): void * This method reorganizes all the scattered config values into organized JSON objects * * @return array Compaction results - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function compactToJsonConfiguration(): array { @@ -4929,7 +4929,7 @@ public function compactToJsonConfiguration(): array * This method removes the old scattered config values after successful compaction * * @return array Cleanup results - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-3 */ public function cleanupOldConfiguration(): array { @@ -5058,7 +5058,7 @@ public function cleanupOldConfiguration(): array * This aggregates all settings data for the main settings endpoint * * @return array Complete settings data - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function getAllSettings(): array { @@ -5113,7 +5113,7 @@ public function getAllSettings(): array * Get object counts statistics for all configured registers * * @return array Statistics for all registers with object counts - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getObjectCountsStatistics(): array { @@ -5210,7 +5210,7 @@ public function getObjectCountsStatistics(): array * This handles template iteration and individual failures * * @return array All email templates - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function getAllEmailTemplates(): array { @@ -5241,7 +5241,7 @@ public function getAllEmailTemplates(): array * @param array $groups Groups to set. * * @return array Update result with validation. - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function updateGenericUserGroups(array $groups): array { @@ -5283,7 +5283,7 @@ public function updateGenericUserGroups(array $groups): array * @param array $groups Groups to set. * * @return array Update result with validation. - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function updateOrganizationAdminGroups(array $groups): array { @@ -5325,7 +5325,7 @@ public function updateOrganizationAdminGroups(array $groups): array * @param array $groups Groups to set. * * @return array Update result with validation. - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function updateSuperUserGroups(array $groups): array { @@ -5369,7 +5369,7 @@ public function updateSuperUserGroups(array $groups): array * Get ArchiMate configuration only * * @return array ArchiMate configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function getArchiMateConfig(): array { @@ -5403,7 +5403,7 @@ public function getArchiMateConfig(): array * @param array $config ArchiMate configuration data * * @return array Result of the update operation - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function updateArchiMateConfig(array $config): array { @@ -5434,7 +5434,7 @@ public function updateArchiMateConfig(array $config): array * Get email configuration only * * @return array Email configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function getEmailConfigFocused(): array { @@ -5468,7 +5468,7 @@ public function getEmailConfigFocused(): array * @param array $config Email configuration data * * @return array Result of the update operation - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-4 */ public function updateEmailConfig(array $config): array { @@ -5504,7 +5504,7 @@ public function updateEmailConfig(array $config): array * Get AMEF configuration only * * @return array AMEF configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function getAmefConfigFocused(): array { @@ -5536,7 +5536,7 @@ public function getAmefConfigFocused(): array * @param array $config AMEF configuration data * * @return array Result of the update operation - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function updateAmefConfig(array $config): array { @@ -5669,7 +5669,7 @@ public function updateAmefConfig(array $config): array * Get Voorzieningen configuration only * * @return array Voorzieningen configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function getVoorzieningenConfigFocused(): array { @@ -5701,7 +5701,7 @@ public function getVoorzieningenConfigFocused(): array * @param array $config Voorzieningen configuration data * * @return array Result of the update operation - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-2 */ public function updateVoorzieningenConfig(array $config): array { @@ -5732,7 +5732,7 @@ public function updateVoorzieningenConfig(array $config): array * Get object counts only (lightweight) * * @return array Object counts for all registers - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getObjectsCounts(): array { @@ -5765,7 +5765,7 @@ public function getObjectsCounts(): array * Get object statistics (full statistics with configuration) * * @return array Full object statistics - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getObjectsStatistics(): array { @@ -5794,7 +5794,7 @@ public function getObjectsStatistics(): array * Get user groups configuration only * * @return array User groups configuration - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getUserGroupsConfig(): array { @@ -5831,7 +5831,7 @@ public function getUserGroupsConfig(): array * @param array $config User groups configuration data * * @return array Result of the update operation - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function updateUserGroupsConfig(array $config): array { @@ -5919,7 +5919,7 @@ public function setCatalogLocation(string $location): void * - dry_run: Only check what would be created (default: false) * * @return array Sync results with performance metrics - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function syncOrganisationsToVoorzieningenOptimized(array $options=[]): array { @@ -6241,7 +6241,7 @@ private function determineOrganisationType(\OCA\OpenRegister\Db\Organisation $or * Will be removed in a future version. * * @return array The cronjob configurations indexed by job name - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getCronjobConfig(): array { @@ -6319,7 +6319,7 @@ private function getAvailableCronjobs(): array * * @deprecated Cronjob context is no longer needed since sync operations use _rbac: false. * Will be removed in a future version. - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function updateCronjobConfig(array $data): array { @@ -6401,7 +6401,7 @@ public function updateCronjobConfig(array $data): array * * @deprecated Cronjob context is no longer needed since sync operations use _rbac: false. * Will be removed in a future version. - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getCronjobContext(string $jobId): ?array { @@ -6444,7 +6444,7 @@ public function getCronjobContext(string $jobId): ?array * Will be removed in a future version. * * @return array List of users with id and display name - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getAvailableUsersForCronjobs(): array { @@ -6511,7 +6511,7 @@ public function getAvailableUsersForCronjobs(): array * Will be removed in a future version. * * @return array List of organisations with uuid and name - * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 + * @spec openspec/changes/retrofit-2026-05-26-settings-service/tasks.md#task-5 */ public function getAvailableOrganisationsForCronjobs(): array { diff --git a/lib/Service/SoftwareCatalogue/ContactPersonHandler.php b/lib/Service/SoftwareCatalogue/ContactPersonHandler.php index d511cb85..82ac056c 100644 --- a/lib/Service/SoftwareCatalogue/ContactPersonHandler.php +++ b/lib/Service/SoftwareCatalogue/ContactPersonHandler.php @@ -6,12 +6,12 @@ * This handler manages contact person-specific operations including user creation, * contact processing, and organizational hierarchy management. * - * @category Handler - * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue - * @author Conduction b.v. + * @category Handler + * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @link https://github.com/ConductionNL/SoftwareCatalog */ declare(strict_types=1); @@ -33,12 +33,12 @@ /** * Handler for contact person-related operations. * - * @category Handler - * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue - * @author Conduction b.v. + * @category Handler + * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @link https://github.com/ConductionNL/SoftwareCatalog * * @SuppressWarnings(PHPMD.ExcessiveClassLength) * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) @@ -107,7 +107,7 @@ private function getObjectService(): ?\OCA\OpenRegister\Service\ObjectService * @param array $contactData The contact data array * * @return string Generated username - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function generateUsernameFromContactData(array $contactData): string { @@ -203,7 +203,7 @@ private function isValidUsername(string $username): bool * @param string $email The email address to sanitize. * * @return string The sanitized email suitable for use as a username. - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function sanitizeEmailForUsername(string $email): string { @@ -234,7 +234,7 @@ public function sanitizeEmailForUsername(string $email): string * @param string $email The email address to validate. * * @return string|null Null if valid, error message if invalid. - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function validateEmailForUsername(string $email): ?string { @@ -306,7 +306,7 @@ private function ensureUniqueUsername(string $username): string * @return \OCP\IUser|null The created user or null if failed. * * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $isFirstContact is a simple role-assignment toggle - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function createUserAccount(object $contactpersoonObject, bool $isFirstContact=false): ?\OCP\IUser { @@ -927,7 +927,7 @@ private function addUserToGroupWithCheck(\OCP\IUser $user, string $groupName, st * @param array $contactData The updated contact person data * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function updateUserGroupsFromContactData(\OCP\IUser $user, array $contactData): void { @@ -1009,7 +1009,7 @@ public function updateUserGroupsFromContactData(\OCP\IUser $user, array $contact * * @return void * @deprecated Use updateUserGroupsFromContactData instead - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function updateUserGroupsFromRoles(\OCP\IUser $user, array $newRoles, array $oldRoles=[]): void { @@ -1152,7 +1152,7 @@ private function getOrganizationGroup(string $organizationId): ?\OCP\IGroup * @param array $objectData The contact data * * @return bool True if this is the first contact for the organization - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function isFirstContactForOrganization(object $contactObject, array $objectData): bool { @@ -1276,7 +1276,7 @@ private function getDisplayNameFromContactData(array $contactData): string * @param array $contactData The contact data containing name fields * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function storeContactNameFields(\OCP\IUser $user, array $contactData): void { @@ -1380,7 +1380,7 @@ public function storeContactNameFields(\OCP\IUser $user, array $contactData): vo * @param object $contactObject The contact object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function handleNewContact(object $contactObject): void { @@ -1411,7 +1411,7 @@ public function handleNewContact(object $contactObject): void * @param object $contactObject The contact object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function handleContactUpdate(object $contactObject): void { @@ -1442,7 +1442,7 @@ public function handleContactUpdate(object $contactObject): void * @param object $contactObject The contact object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function handleContactDeletion(object $contactObject): void { @@ -1497,7 +1497,7 @@ public function handleContactDeletion(object $contactObject): void * @param string $organizationUuid The organization UUID * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function assignBeheerderRole(object $contactpersoonObject, string $username, string $organizationUuid): void { @@ -1570,7 +1570,7 @@ public function assignBeheerderRole(object $contactpersoonObject, string $userna * @param string $managerUsername The manager's username * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function setUserManager(string $username, string $managerUsername): void { @@ -1625,7 +1625,7 @@ public function setUserManager(string $username, string $managerUsername): void * @param string $username The username * * @return string|null The manager's username or null if not set - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function getUserManager(string $username): ?string { @@ -1874,7 +1874,7 @@ private function sendUserCreationEmail(\OCP\IUser $user, array $objectData): voi * @throws \Exception If processing fails * * @SuppressWarnings(PHPMD.BooleanArgumentFlag) $isUpdate is a simple create-vs-update toggle - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function processContactpersoon(object $contactpersoonObject, bool $isUpdate=false): bool { @@ -2016,7 +2016,7 @@ public function processContactpersoon(object $contactpersoonObject, bool $isUpda * @param string $username The username to set as inactive * * @return bool True if successful - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function setUserInactive(string $username): bool { @@ -2063,7 +2063,7 @@ public function setUserInactive(string $username): bool * @param string $username The username to set as active * * @return bool True if successful - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function setUserActive(string $username): bool { @@ -2111,7 +2111,7 @@ public function setUserActive(string $username): bool * @param object $oldContactpersoonObject The previous contactpersoon object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function handleContactpersoonUpdate(object $contactpersoonObject, object $oldContactpersoonObject): void { @@ -2227,7 +2227,7 @@ private function sendAccountSuspensionEmail(\OCP\IUser $user, array $objectData) * @param object $contactpersoonObject The contactpersoon object * * @return bool True if the user should be added to the organization - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function shouldAddContactpersoonToOrganization(object $contactpersoonObject): bool { @@ -2303,7 +2303,7 @@ public function shouldAddContactpersoonToOrganization(object $contactpersoonObje * @param object $contactpersoonObject The contactpersoon object * * @return bool True if the user was successfully added - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function addContactpersoonToOrganization(object $contactpersoonObject): bool { @@ -2414,7 +2414,7 @@ public function addContactpersoonToOrganization(object $contactpersoonObject): b * @param object $contactpersoonObject The contactpersoon object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function ensureContactpersoonInOrganization(object $contactpersoonObject): void { @@ -2483,7 +2483,7 @@ public function ensureContactpersoonInOrganization(object $contactpersoonObject) * (useful when organisatie field was removed from object data) * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-1 */ public function addUserToOrganizationEntity( object $contactpersoonObject, diff --git a/lib/Service/SoftwareCatalogue/GroupHandler.php b/lib/Service/SoftwareCatalogue/GroupHandler.php index ffdb782f..13c69353 100644 --- a/lib/Service/SoftwareCatalogue/GroupHandler.php +++ b/lib/Service/SoftwareCatalogue/GroupHandler.php @@ -6,13 +6,13 @@ * This handler manages generic user groups, role-based group assignments, * and ensures all required groups exist and are properly configured. * - * @category Handler - * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue - * @author Conduction b.v. + * @category Handler + * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: + * @link https://github.com/ConductionNL/SoftwareCatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-10 */ @@ -35,13 +35,13 @@ /** * Handler for group management operations * - * @category Handler - * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue - * @author Conduction b.v. + * @category Handler + * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: + * @link https://github.com/ConductionNL/SoftwareCatalog * * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) * @SuppressWarnings(PHPMD.CamelCaseParameterName) @@ -95,7 +95,7 @@ private function getObjectService(): ?ObjectService * Gets the list of generic user groups from configuration * * @return array Array of generic user groups - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 */ public function getGenericUserGroups(): array { @@ -123,7 +123,7 @@ public function getGenericUserGroups(): array * @param array $groups Array of generic user groups * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 */ public function setGenericUserGroups(array $groups): void { @@ -142,7 +142,7 @@ public function setGenericUserGroups(array $groups): void * Ensures that all generic user groups exist in the system * * @return array Array of groups that were created - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 */ public function ensureGenericUserGroupsExist(): array { @@ -198,7 +198,7 @@ public function ensureGenericUserGroupsExist(): array * @param string $groupName The group name to create * * @return IGroup|null The created or existing group - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 */ public function createGroupIfNotExists(string $groupName): ?IGroup { @@ -283,7 +283,7 @@ public function updateUserGroups(object $contactpersoonObject, string $username) * @param array $objectData The contactpersoon data * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 */ public function updateRoleBasedGroups(IUser $user, array $objectData): void { @@ -346,7 +346,7 @@ public function updateRoleBasedGroups(IUser $user, array $objectData): void * @param array $objectData The contactpersoon data * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 */ public function updateOrganizationGroups(IUser $user, array $objectData): void { @@ -419,7 +419,7 @@ public function updateOrganizationGroups(IUser $user, array $objectData): void * @param array $objectData The contactpersoon data * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 */ public function updateGemeenteGroups(IUser $user, array $objectData): void { @@ -476,7 +476,7 @@ public function updateGemeenteGroups(IUser $user, array $objectData): void * Gets all available groups with their information * * @return array Array of group information - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 */ public function getAllGroups(): array { @@ -501,7 +501,7 @@ public function getAllGroups(): array * @param array $groups Array of group names to validate * * @return array Array with validation results - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-2 */ public function validateGroups(array $groups): array { diff --git a/lib/Service/SoftwareCatalogue/HierarchyHandler.php b/lib/Service/SoftwareCatalogue/HierarchyHandler.php index 6ea93284..49b20ea1 100644 --- a/lib/Service/SoftwareCatalogue/HierarchyHandler.php +++ b/lib/Service/SoftwareCatalogue/HierarchyHandler.php @@ -6,13 +6,13 @@ * This handler manages organizational hierarchy, beheerder assignments, * and manager relationships within organizations. * - * @category Handler - * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue - * @author Conduction b.v. + * @category Handler + * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: + * @link https://github.com/ConductionNL/SoftwareCatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-9 */ @@ -30,13 +30,13 @@ /** * Handler for organizational hierarchy management * - * @category Handler - * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue - * @author Conduction b.v. + * @category Handler + * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: + * @link https://github.com/ConductionNL/SoftwareCatalog * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) @@ -77,7 +77,7 @@ public function __construct( * @param string $username The username being processed * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-3 */ public function ensureOrganizationBeheerder(object $contactgegevensObject, string $username): void { @@ -129,7 +129,7 @@ public function ensureOrganizationBeheerder(object $contactgegevensObject, strin * @param string $organizationUuid The organization UUID * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-3 */ public function setupManagerRelationships( string $username, diff --git a/lib/Service/SoftwareCatalogue/OrganizationHandler.php b/lib/Service/SoftwareCatalogue/OrganizationHandler.php index b3d45b56..c5fe377e 100644 --- a/lib/Service/SoftwareCatalogue/OrganizationHandler.php +++ b/lib/Service/SoftwareCatalogue/OrganizationHandler.php @@ -6,13 +6,13 @@ * This handler manages organization-specific operations including group creation, * organization processing, and hierarchy management. * - * @category Handler - * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue - * @author Conduction b.v. + * @category Handler + * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: + * @link https://github.com/ConductionNL/SoftwareCatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-9 */ @@ -32,13 +32,13 @@ /** * Handler for organization-related operations. * - * @category Handler - * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue - * @author Conduction b.v. + * @category Handler + * @package OCA\SoftwareCatalog\Service\SoftwareCatalogue + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @version GIT: - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @version GIT: + * @link https://github.com/ConductionNL/SoftwareCatalog * * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) * @SuppressWarnings(PHPMD.CyclomaticComplexity) @@ -162,7 +162,7 @@ public function processOrganization(object $organizationObject): bool * @param array $objectData The organization data * * @return string|null The group ID or null if failed - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 */ public function ensureOrganizationGroup(object $organizationObject, array &$objectData): ?string { @@ -256,7 +256,7 @@ private function ensureUniqueGroupName(string $baseName): string * @param string $groupName The group name to create * * @return IGroup|null The created or existing group - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 */ public function createGroupIfNotExists(string $groupName): ?IGroup { @@ -292,7 +292,7 @@ public function createGroupIfNotExists(string $groupName): ?IGroup * @param string $name The name to sanitize * * @return string The sanitized group name - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 */ public function sanitizeGroupName(string $name): string { @@ -621,7 +621,7 @@ private function mapFunctieToRoles(string $functie, bool $isFirstContact=false): * @param object $organizationObject The organization object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 */ public function handleNewOrganization(object $organizationObject): void { @@ -670,7 +670,7 @@ public function handleNewOrganization(object $organizationObject): void * @param string $organizationUuid The organization UUID * * @return array Array of usernames who are beheerders in this organization - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 */ public function getOrganizationBeheerders(string $organizationUuid): array { @@ -746,7 +746,7 @@ function ($a, $b) { * @param string $organizationUuid The organization UUID * * @return bool True if user belongs to organization - * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-sc-handlers/tasks.md#task-4 */ public function userBelongsToOrganization(IUser $user, string $organizationUuid): bool { diff --git a/lib/Service/SoftwareCatalogueService.php b/lib/Service/SoftwareCatalogueService.php index ff017a3a..1cdaf7eb 100644 --- a/lib/Service/SoftwareCatalogueService.php +++ b/lib/Service/SoftwareCatalogueService.php @@ -6,12 +6,12 @@ * Service for handling software catalog specific operations including * user management, contact processing, and object lifecycle management. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @link https://github.com/ConductionNL/SoftwareCatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-3 */ @@ -38,12 +38,12 @@ * Provides functionality for user management, contact processing, * email notifications, and object lifecycle management. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license AGPL-3.0-or-later https://www.gnu.org/licenses/agpl-3.0.html + * @link https://github.com/ConductionNL/SoftwareCatalog * * @SuppressWarnings(PHPMD.ExcessiveClassLength) * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) @@ -399,7 +399,7 @@ public function processOrganization(object $organizationObject): bool * @param string $username The username to update groups for * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function updateUserGroups(object $contactpersoonObject, string $username): void { @@ -420,7 +420,7 @@ public function updateUserGroups(object $contactpersoonObject, string $username) * @param string $username The username being processed * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function ensureOrganizationBeheerder(object $contactpersoonObject, string $username): void { @@ -434,7 +434,7 @@ public function ensureOrganizationBeheerder(object $contactpersoonObject, string * @param string $username The username * * @return string|null The manager's username or null if not set - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function getUserManager(string $username): ?string { @@ -448,7 +448,7 @@ public function getUserManager(string $username): ?string * @param object $organizationObject The new organization object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 */ public function handleNewOrganization(object $organizationObject): void { @@ -636,7 +636,7 @@ public function handleNewOrganization(object $organizationObject): void * @param object $oldOrganizationObject The previous organization object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 */ public function handleOrganizationUpdate(object $organizationObject, object $oldOrganizationObject): void { @@ -806,7 +806,7 @@ private function activateContactpersonenForOrganization(string $organizationId): * @return void * * @deprecated This method is disabled to prevent organization duplication. - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 */ public function sendOrganizationWelcomeEmail(object $organizationObject): void { @@ -829,7 +829,7 @@ public function sendOrganizationWelcomeEmail(object $organizationObject): void * @param object $contactObject The contact object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function handleNewContact(object $contactObject): void { @@ -843,7 +843,7 @@ public function handleNewContact(object $contactObject): void * @param object $contactObject The contact object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function createUserForContactIfNotExists(object $contactObject): void { @@ -862,7 +862,7 @@ public function createUserForContactIfNotExists(object $contactObject): void * @param object $gebruikerObject The gebruiker object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 */ public function handleNewGebruiker(object $gebruikerObject): void { @@ -881,7 +881,7 @@ public function handleNewGebruiker(object $gebruikerObject): void * @param object $gebruikerObject The gebruiker object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 */ public function sendGebruikerWelcomeEmail(object $gebruikerObject): void { @@ -900,7 +900,7 @@ public function sendGebruikerWelcomeEmail(object $gebruikerObject): void * @param object $contactObject The contact object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function handleContactUpdate(object $contactObject): void { @@ -915,7 +915,7 @@ public function handleContactUpdate(object $contactObject): void * @param object $oldGebruikerObject The old gebruiker object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 */ public function handleGebruikerUpdate(object $gebruikerObject, object $oldGebruikerObject): void { @@ -934,7 +934,7 @@ public function handleGebruikerUpdate(object $gebruikerObject, object $oldGebrui * @param object $contactObject The contact object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function handleContactDeletion(object $contactObject): void { @@ -948,7 +948,7 @@ public function handleContactDeletion(object $contactObject): void * @param object $gebruikerObject The gebruiker object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 */ public function blockUserForGebruiker(object $gebruikerObject): void { @@ -967,7 +967,7 @@ public function blockUserForGebruiker(object $gebruikerObject): void * @param object $gebruikerObject The gebruiker object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 */ public function temporarilyBlockUserForGebruiker(object $gebruikerObject): void { @@ -986,7 +986,7 @@ public function temporarilyBlockUserForGebruiker(object $gebruikerObject): void * @param object $gebruikerObject The gebruiker object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 */ public function restoreUserAccessForGebruiker(object $gebruikerObject): void { @@ -1006,7 +1006,7 @@ public function restoreUserAccessForGebruiker(object $gebruikerObject): void * @param mixed $revertPoint The revert point * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 */ public function syncUserWithRevertedContact(object $contactObject, mixed $revertPoint): void { @@ -1026,7 +1026,7 @@ public function syncUserWithRevertedContact(object $contactObject, mixed $revert * @param mixed $revertPoint The revert point * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-3 */ public function updateUserFromRevertedGebruiker(object $gebruikerObject, mixed $revertPoint): void { @@ -1065,7 +1065,7 @@ public function setGenericUserGroups(array $groups): void * Ensures all generic user groups exist * * @return array Array of created/existing groups - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-4 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-4 */ public function ensureGenericUserGroupsExist(): array { @@ -1103,7 +1103,7 @@ public function getOrganizationStructure(string $organizationUuid): array * @param object $oldContactpersoonObject The previous contactpersoon object (optional) * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function handleContactpersoonUpdate(object $contactpersoonObject, object $oldContactpersoonObject=null): void { @@ -1271,7 +1271,7 @@ public function handleContactpersoonUpdate(object $contactpersoonObject, object * @param object $organizationObject The organization object being deleted * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 */ public function handleOrganizationDeletion(object $organizationObject): void { @@ -1316,7 +1316,7 @@ public function handleOrganizationDeletion(object $organizationObject): void * @param object $organizationObject The organization object to sync * * @return bool True if sync was successful - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 */ public function syncOrganizationWithOpenRegister(object $organizationObject): bool { @@ -1462,7 +1462,7 @@ public function syncOrganizationWithOpenRegister(object $organizationObject): bo * @param array $objectData The organization object data * * @return object|null The created organisation entity or null on failure - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-2 */ public function createOrganisationInOpenRegister(array $objectData): ?object { @@ -2739,7 +2739,7 @@ private function addAdminGroupUsersToOrganization(string $organizationUuid): voi * @param object $contactpersoonObject The contactpersoon object * * @return bool True if the user should be added to the organization - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function shouldAddContactpersoonToOrganization(object $contactpersoonObject): bool { @@ -2815,7 +2815,7 @@ public function shouldAddContactpersoonToOrganization(object $contactpersoonObje * @param object $contactpersoonObject The contactpersoon object * * @return bool True if the user was successfully added - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function addContactpersoonToOrganization(object $contactpersoonObject): bool { @@ -3186,7 +3186,7 @@ private function handleOwnershipAssignment(object $organizationObject): void * @param string $organizationUuid The UUID of the organization * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function syncContactPersonUsernamesWithOrganization(string $organizationUuid): void { @@ -3328,7 +3328,7 @@ public function syncContactPersonUsernamesWithOrganization(string $organizationU * @param object $contactPersonObject The contact person object * * @return void - * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-softwarecatalogue-orchestration/tasks.md#task-1 */ public function ensureContactPersonInOrganization(object $contactPersonObject): void { diff --git a/lib/Service/SymfonyEmailService.php b/lib/Service/SymfonyEmailService.php index 02e3d783..223baafa 100644 --- a/lib/Service/SymfonyEmailService.php +++ b/lib/Service/SymfonyEmailService.php @@ -599,7 +599,7 @@ public function sendOrganizationRegistrationEmail(array $organization): bool * @return bool True if email was sent successfully, false otherwise. * * @throws \Exception If email sending fails. - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 */ public function sendOrganizationActivationEmail(array $organization): bool { @@ -707,7 +707,7 @@ public function sendOrganizationActivationEmail(array $organization): bool * @return bool True if email was sent successfully, false otherwise. * * @throws \Exception If email sending fails. - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 */ public function sendUserCreationEmail(array $user, array $organization=[]): bool { @@ -822,7 +822,7 @@ public function sendUserCreationEmail(array $user, array $organization=[]): bool * @return bool True if email was sent successfully, false otherwise. * * @throws \Exception If email sending fails. - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 */ public function sendUserUpdateEmail(array $user, array $organization=[]): bool { @@ -938,7 +938,7 @@ public function sendUserUpdateEmail(array $user, array $organization=[]): bool * @return bool True if email was sent successfully, false otherwise. * * @throws \Exception If email sending fails. - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 */ public function sendUserPasswordEmail(array $user, string $password, array $organization=[]): bool { @@ -1306,7 +1306,7 @@ private function validateEmail(string $email): bool * Gets the configured sender email address. * * @return string The sender email address. - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 */ public function getSenderEmail(): string { @@ -1318,7 +1318,7 @@ public function getSenderEmail(): string * Gets the configured sender name. * * @return string The sender name. - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 */ public function getSenderName(): string { @@ -1330,7 +1330,7 @@ public function getSenderName(): string * Gets all email settings including transport configuration. * * @return array The email settings. - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 */ public function getEmailSettings(): array { @@ -1359,7 +1359,7 @@ public function getAvailableTransports(): array * @param string $email The sender email address. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 */ public function setSenderEmail(string $email): void { @@ -1378,7 +1378,7 @@ public function setSenderEmail(string $email): void * @param string $name The sender name. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 */ public function setSenderName(string $name): void { @@ -1394,7 +1394,7 @@ public function setSenderName(string $name): void * @param array $transportConfig Transport-specific configuration. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 */ public function setTransportConfiguration(string $transportType, array $transportConfig=[]): void { @@ -1414,7 +1414,7 @@ public function setTransportConfiguration(string $transportType, array $transpor * @param string $testEmail The email address to send test email to. * * @return bool True if test email was sent successfully. - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-1 */ public function sendTestEmail(string $testEmail): bool { @@ -1482,7 +1482,7 @@ public function setEnabled(bool $enabled): void * @param string $email The test receiver override email address. * * @return void - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 */ public function setTestReceiverOverride(string $email): void { @@ -1545,7 +1545,7 @@ public function setUserPasswordEnabled(bool $enabled): void * Checks if the email system is fully configured with credentials and templates. * * @return array Configuration status with details. - * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-email-delivery/tasks.md#task-2 */ public function isEmailSystemConfigured(): array { diff --git a/lib/Service/ViewService.php b/lib/Service/ViewService.php index 65f29871..3e43784e 100644 --- a/lib/Service/ViewService.php +++ b/lib/Service/ViewService.php @@ -6,13 +6,13 @@ * Handles view-specific operations including querying, enrichment with products, * and usage data (gebruik) integration. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * @version GIT: - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @version GIT: + * @link https://github.com/ConductionNL/SoftwareCatalog * * @spec openspec/changes/retrofit-2026-05-24-annotate-softwarecatalog/tasks.md#task-8 */ @@ -36,13 +36,13 @@ * This service provides operations for querying and enriching views with additional * data such as products, usage information (gebruik), and related data. * - * @category Service - * @package OCA\SoftwareCatalog\Service - * @author Conduction b.v. + * @category Service + * @package OCA\SoftwareCatalog\Service + * @author Conduction b.v. * @copyright 2024 Conduction B.V. - * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * @version GIT: - * @link https://github.com/ConductionNL/SoftwareCatalog + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @version GIT: + * @link https://github.com/ConductionNL/SoftwareCatalog * * @SuppressWarnings(PHPMD.ExcessiveClassLength) * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) @@ -163,7 +163,7 @@ public function getAllViews(array $options=[]): array * @param array $options Query options including enrichment flags. * * @return array View object with optional enrichments or error response. - * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-2 + * @spec openspec/changes/retrofit-2026-05-26-dashboard-views-api/tasks.md#task-2 */ public function getView(string $viewId, array $options=[]): array { diff --git a/test-results/README.md b/test-results/README.md deleted file mode 100644 index 1dd6a589..00000000 --- a/test-results/README.md +++ /dev/null @@ -1,247 +0,0 @@ -# GEMMA Softwarecatalogus — Test Results Summary - -**Date:** 2026-03-19 -**Environment:** http://localhost:3000 (Frontend), http://localhost:8080 (Backend) -**Method:** Combined API tests (Newman) + Browser tests (7 persona agents) - ---- - -## Overall Results - -| Status | Count | Percentage | -|--------|-------|------------| -| **PASS** | 33 | 39% | -| **PARTIAL** | 27 | 32% | -| **FAIL** | 7 | 8% | -| **CANNOT_TEST** | 18 | 21% | -| **Total tested** | 85 | — | - -## API Test Results -- 454 assertions executed, 417 passed (91.9%) -- 334 requests, 28s duration, avg 65ms response time -- 25 of 37 failures are systemic (OpenCatalogi publications API returns HTTP 500) -- Core API (folders 00-10): 12 failures across 7 issues - -## FAIL Issues (Requires Attention) - -| Issue | Title | Severity | Agent(s) | Summary | -|-------|-------|----------|----------|---------| -| #395 | Menu linkerkant verdwijnt | HIGH | Gemeente, Security | Left navigation menu completely absent on all beheer pages. Console: "Beheer menu (position 7) not found or has no children". Affects all authenticated personas. | -| #455 | Koppelingen/contactpersonen tabs publiekelijk niet getoond | HIGH | Bezoeker, Security | Koppelingen and Contactpersonen tabs missing from public AND authenticated detail pages. Backend `/uses` and `/used` endpoints return HTTP 500. | -| #349 | UUID's onder standaarden filter | HIGH | Gemeente | Standaardversies on search result cards show raw UUIDs. Name resolution returns 404 for standard version references. | -| #377 | Tabel toont diensten niet | MEDIUM | Leverancier | Diensten column shows "-" for all rows in beheer table, despite applications having linked diensten. | -| #400 | Koppeling opslaan geeft foutmelding | MEDIUM | API | API tests: koppeling visibility in list, re-save, and data persistence all fail (3 assertions). | -| #155 | Definities via interactieve optie (Begrippenlijst) | MEDIUM | API, Func. Beheerder | All 5 Newman glossary assertions fail (endpoint empty/not returning data). API returns 6 terms but interactive UI untestable. | -| #332 | Voorpagina inrichten | MEDIUM | API, Func. Beheerder | Authenticated search endpoint assertion fails in API tests. Homepage loads but CMS editing untestable. | - -## PARTIAL Issues - -| Issue | Title | Agent(s) | Summary | -|-------|-------|----------|---------| -| #144 | Overzicht organisaties met zoek- en filteropties | Gemeente, Leverancier | Filters present and working. Some koppeling card names show UUIDs instead of readable names. | -| #278 | Filterteksten aanpassen | Gemeente, Bezoeker | Filter labels updated correctly (Type, Licentievorm, etc.). Wizard consistency and VNG documentation untested. | -| #340 | Bevindingen tussenoplevering Zoeken | Gemeente | Most criteria met (sorting, Type filter, dates on cards). Diensttype filter and active filter indicator untested. | -| #187 | Tekstvoorstellen (remaining text changes) | Leverancier, Func. Beheerder | Dashboard text correct. Many wizard/dialog texts untestable due to org fetch errors. | -| #57 | Pakketten opvoeren voor samenwerkingsverband | Samenwerking | 5/6 criteria pass. Login, dashboard, wizards all work. Member municipality delegation feature not implemented. | -| #186 | Koppelingen | Samenwerking | Detail pages render. External services resolve. Module name resolution fails causing UUID-only titles. | -| #85 | Publieke API toegang tot aanbodinformatie | Security, Func. Beheerder | Public API returns data correctly. OAS documentation endpoint returns HTTP 500. | -| #183 | Wachtwoord vergeten optie | Security | UI flow works (button, form, navigation). Email delivery cannot be tested (SMTP disabled). | -| #148 | GEMMA-architectuur opvraagbaar met API | Architectuur, Func. Beheerder | API data correct (4,353 elements, 6,049 relations, 248 views). OAS regression to 500. "Gemma downloaden" button disappeared. Model-id filter non-functional. | -| #92 | Webstatistiekenpakket (Piwik Pro) | Func. Beheerder | Piwik Pro script shell present but not configured (empty srcUrl, dataLayerName, id). SiteImprove removed. | -| #169 | Rest issues Organisatie en Configuratie | Func. Beheerder | Organisation activation works via API. Frontend org display untestable due to org fetch errors. | -| #141 | Organisaties samenvoegen (Merge) | Func. Beheerder | Merge test org created/deleted via API. Merge UI dialog in backend not tested. | -| #15 | Data exporteren | Func. Beheerder, Gemeente | CSV and Excel export work via API. Includes human-readable `_columnName` columns. Frontend export button untestable. | -| #316 | Dienst toevoegen: Stap 1 | Gemeente | Uses "publiceren" flow instead of "toevoegen" flow. Text mismatch with acceptance criteria. | -| #317 | Dienst toevoegen: Stap 2 | Gemeente | Different flow than expected. Shows dienst detail fields instead of gebruiksinformatie. | -| #318 | Dienst toevoegen: Stap 3 | Gemeente | Review step present. Text partially matches acceptance criteria. | -| #319 | Koppeling toevoegen: Stap 1 | Gemeente | Uses "publiceren" flow. Title and section header text mismatch. | -| #320 | Koppeling toevoegen: Stap 2 | Gemeente | Status and startdatum fields present. Text differs from expected. | -| #322 | Koppeling toevoegen: Stap 4 | Gemeente | Review present. Blue info box text about visibility differs. | -| #323 | Applicatie toevoegen: Stap 1 | Gemeente | Most text matches. Extra "klanten" paragraph incorrect for gemeente perspective. | -| #324 | Applicatie toevoegen: Stap 2 | Gemeente | Fields correct. Hosting showed "Geen hosting opties beschikbaar". | -| #327 | Applicatie toevoegen: Stap 5 Controleren | Gemeente | Review text uses "applicatiegebruik melding" instead of expected text. | -| #314 | Wizard koppeling vindt applicaties niet | Leverancier | Applications found in dropdown, but wizard blocked at next step (Volgende disabled). | -| #454 | Wizard koppelingen bestaande niet gevonden | Leverancier | Wizard correctly showed "Geen bestaande koppelingen" but blocked at next step. | -| #456 | Consistentie in werking van wizards | Leverancier | Applicatie and Dienst wizards consistent. Koppeling wizard has Volgende button bug. | -| #397 | Pagina aanmaken via CMS | Func. Beheerder | CMS pages API returns 2 pages (Home, About). Admin CMS navigation untestable. | -| #135 | Non-functionele eisen Referentiearchitectuur | Architectuur | API performance acceptable. Architecture UI section completely inaccessible (CMS page 404). Regression. | - -## Results by Agent - -### 1. Leverancier — Jan Pietersen (browser-1) -| PASS | PARTIAL | FAIL | CANNOT_TEST | CLOSED | -|------|---------|------|-------------|--------| -| 19 | 4 | 2 | 15 | 33 | - -Key findings: -- Applicatie and Dienst wizards complete successfully end-to-end -- **New bug:** Koppeling wizard Volgende button stays disabled despite all required fields filled -- Applicatiegebruik wizard hit 503 (backend maintenance mode during test) -- Beheer table shows applications from ALL organizations (RBAC scoping concern) -- #377 FAIL: Diensten column shows "-" despite linked diensten existing - -### 2. Gemeente — Maria van der Berg (browser-2) -| PASS | PARTIAL | FAIL | CANNOT_TEST | -|------|---------|------|-------------| -| 10 | 12 | 2 | 5 | - -Key findings: -- All 3 wizard walkthroughs (Applicatie, Dienst, Koppeling) completed successfully -- Koppeling wizard Volgende button required force-click to proceed (same bug as Leverancier) -- #395 FAIL: No left sidebar navigation on any beheer page -- #349 FAIL: Standaardversies show raw UUIDs on koppeling cards -- Many wizard text issues: "publiceren" flow used instead of "toevoegen" flow (#316-#327) - -### 3. Security Officer — Mark Jansen (browser-3) -| PASS | PARTIAL | FAIL | CANNOT_TEST | -|------|---------|------|-------------| -| 6 | 5 | 2 | 1 | - -Key findings: -- RBAC enforcement solid: gemeente contacts blocked for unauthenticated, 305 visible for authenticated gebruik-beheerder -- #455 FAIL: Koppelingen/Contactpersonen tabs missing (uses/used endpoints return 500) -- #395 FAIL: Left sidebar menu completely absent -- **Security finding (MEDIUM):** Public search facets expose private data type counts (305 contactpersonen, 19,502 gebruik records) -- SiteImprove completely removed (#406 PASS) - -### 4. Functioneel Beheerder — Peter van Dijk (browser-4) -| PASS | PARTIAL | FAIL | CANNOT_TEST | -|------|---------|------|-------------| -| 9 | 7 | 0 | 7 | - -Key findings: -- #410 PASS: Dashboard writes "softwarecatalogus" (lowercase) correctly -- #286 PASS: Password change works without 500 error -- #396 PASS: Nextcloud version 32.0.5 -- #393 PASS: Backend register endpoints all return 200; CSV/Excel export works -- OAS endpoint returns HTTP 500 for both register 3 and 4 -- Organisation UUID mapping broken for all test users (systemic environment issue) - -### 5. Samenwerking — Linda Bakker (browser-5) -| PASS | PARTIAL | FAIL | CANNOT_TEST | -|------|---------|------|-------------| -| 0 | 2 | 0 | 0 | - -Key findings: -- #57 PARTIAL (stable): TypeError fix confirmed stable (8th consecutive test). New org dropdown added. Member municipality delegation not yet implemented. -- #186 PARTIAL (stable): Koppeling detail pages render. External services resolve correctly. Module name resolution failures cause UUID-only titles. -- Category search (`categorie=koppeling`) returns 0 results - -### 6. Bezoeker — Anonymous Visitor (browser-6) -| PASS | PARTIAL | FAIL | CANNOT_TEST | -|------|---------|------|-------------| -| 4 | 1 | 1 | 7 | - -Key findings: -- #394 PASS: Contactpersonen RBAC correctly enforced (0 results unauthenticated) -- #315 PASS: No municipal data visible publicly, RBAC filtering active -- #267 PASS: "Softwarecatalogus" naming consistent across all pages -- #455 FAIL: Only Standaarden and Geschikt voor tabs shown on detail pages -- Many issues CANNOT_TEST due to missing test data (no dienst/koppeling publications) - -### 7. Architectuur Expert — Dr. Sarah de Vries (browser-7) -| PASS | PARTIAL | FAIL | CANNOT_TEST | -|------|---------|------|-------------| -| 0 | 2 | 0 | 1 | - -Key findings: -- #148 PARTIAL: GEMMA API data correct (4,353 elements, 6,049 relations, 248 views, 1 model). OAS endpoint regression to 500. "Gemma downloaden" button disappeared. Model-id filter non-functional. -- #160 CANNOT_TEST: Entire referentiearchitectuur section inaccessible (CMS page 404). Regression from previous run. -- #135 PARTIAL: API performance acceptable but architecture UI completely inaccessible. Worse than previous run. - -## PASS Issues (Verified Working) - -| Issue | Title | Agent(s) | -|-------|-------|----------| -| #267 | Naam is softwarecatalogus i.p.v. Softwarecatalogus | Bezoeker | -| #263 | Niet ingelogd: gebruik tab toont gemeenten | Bezoeker | -| #315 | Zoekpagina toont gemeentelijk applicatielandschap | Bezoeker, Gemeente, Security | -| #394 | Contactpersonen gemeenten publiekelijk zichtbaar | Bezoeker, Security | -| #266 | Na inloggen: Mijn account leeg? | Gemeente | -| #280 | Zoeken: sorteren gaat niet goed | Gemeente | -| #344 | Zoeken: Geen resultaten bij Gravenbeheercomponent | Gemeente, Leverancier | -| #353 | Mijn account functie niet aangepast | Gemeente | -| #343 | Filter 'Type koppeling' toevoegen | Gemeente | -| #346 | Paginering werkt niet | Gemeente | -| #325 | Applicatie toevoegen: Stap 3 Referentiecomponenten | Gemeente | -| #326 | Applicatie toevoegen: Stap 4 Deelnemer | Gemeente | -| #321 | Koppeling toevoegen: Stap 3 Deelnemer | Gemeente | -| #328 | Applicatie toevoegen: Stap 1.1 Nieuwe applicatie | Gemeente | -| #354 | Diensten: incomplete lijst applicaties | Leverancier | -| #357 | Diensten: Diensttype en Type door elkaar | Leverancier | -| #371 | Applicatie: UUID onder compliance | Leverancier | -| #373 | Applicatie: Gekoppelde diensten niet getoond | Leverancier | -| #375 | Applicaties: versie voor SaaS applicaties | Leverancier | -| #376 | Applicaties: labels wizard en tabel anders | Leverancier | -| #381 | Applicaties: non-compliant vervangen door niet ondersteund | Leverancier | -| #384 | Applicaties: eenduidige manier van bewerken | Leverancier | -| #443 | Dienst pagina: diensttypen aan elkaar geschreven | Leverancier | -| #444 | Vormgeving veranderd bij te lange URLs | Leverancier | -| #445 | Nieuwe dienst verkeerde afsluitende pagina | Leverancier | -| #446 | Dienst publiceren: tekstuele inconsistenties | Leverancier | -| #404 | Regelmatig witte schermen | Security | -| #409 | Footer anders: inlog of uitgelogd | Security, Func. Beheerder | -| #406 | SiteImprove verwijderen | Security, Func. Beheerder | -| #410 | Dashboard schrijfwijze softwarecatalogus | Func. Beheerder | -| #286 | 500-error bij wachtwoord wijzigen | Func. Beheerder | -| #396 | Verouderde NextCloud versie | Func. Beheerder | -| #393 | Backend fouten in voorzieningenregister | Func. Beheerder | - -## Bugs Fixed This Session (11 total) - -| # | Bug | Repo | Impact | -|---|-----|------|--------| -| 1 | Register `languages` property missing | openregister | ALL API 500s | -| 2 | Named parameter `_rbac` mismatch | openregister | ALL PATCH/PUT 500s | -| 3 | Deelnemers empty if block | softwarecatalog | Endpoint always 500 | -| 4 | Publications schema enrichment | opencatalogi | Blank search page | -| 5 | explode() on array in RenderObject | openregister | POST response 500s | -| 6 | Schema URL path wrong | tilburg-woo-ui (5 files) | Gemeente wizards blocked | -| 7 | Diensten missing from catalog | softwarecatalog + data | Diensten invisible in search | -| 8 | View rendering wrong component | tilburg-woo-ui | /beheer/views empty | -| 9 | Default Org UUID mapping | Data + openregister | Functioneel-beheerder blocked | -| 10 | Koppeling wizard missing Naam field | tilburg-woo-ui | "Volgende" permanently disabled | -| 11 | Glossary URL validation + Delete dialog | opencatalogi + nextcloud-vue | Form blocked + UUID shown | - -## CANNOT_TEST Issues - -| Issue | Title | Agent(s) | Reason | -|-------|-------|----------|--------| -| #105 | Aanbieders zien applicatielandschappen niet | Leverancier | `/beheer/applicatielandschappen` route not found | -| #312 | Koppeling heeft verplicht een naam | Leverancier | Koppeling wizard blocked (Volgende disabled) | -| #348 | Standaarden bij Centric Begraven | Leverancier | No imported data in test environment | -| #352 | Mijn account contactpersoon | Leverancier | `/account` page not tested | -| #367 | Contactpersonen tussenvoegsel niet getoond | Leverancier | No contactpersonen with tussenvoegsel in test data | -| #368 | Koppeling zonder richting | Leverancier | Koppeling wizard blocked | -| #369 | Koppeling niet zichtbaar | Leverancier | Koppeling wizard blocked | -| #342 | Zoeken referentiecomponenten duidelijk maken | Gemeente | Need to filter by Type=Applicatie | -| #350 | Link achter gebruikersnaam | Gemeente | Username link not visible in current layout | -| #355 | Diensten export UUID's | Gemeente | Browser download not testable via Playwright | -| #403 | Tekst verwijderen aanpassen | Func. Beheerder | Frontend beheer pages empty due to org fetch 404 | -| #449 | Handleiding facets configureren | Func. Beheerder | Facet editing in backend not navigated | -| #450 | Icoon publiceren verwijderen | Func. Beheerder, Leverancier | Backend UI not inspected | -| #447 | Concept leverancier direct vindbaar | Bezoeker, Security | No concept-status organisations in test data | -| #345 | Dienst verschijnt niet in filters | Bezoeker | Diensten not published as OpenCatalogi publications | -| #347 | Dienstkaartje toont array | Bezoeker | No dienst cards in search results | -| #160 | Performance plotten views | Architectuur | Entire referentiearchitectuur section inaccessible (CMS page 404) | -| #278 (func.) | Filterteksten (backend) | Func. Beheerder | Search page blocked by org fetch error for this agent | - -## Recommendations - -### Immediate (P0) -1. **Fix `/uses` and `/used` endpoints** returning HTTP 500 on publication detail pages (#455) -- breaks tabs for all users (both public and authenticated) -2. **Fix OAS endpoint** regression on registers 3 and 4 -- investigate `organisation` field causing 500 -3. **Fix beheer left sidebar menu** (position 7) not rendering (#395) -- affects all authenticated users -4. **Fix koppeling wizard** Volgende button validation logic -- blocks koppeling creation entirely - -### High Priority (P1) -5. **Fix search facets** to exclude private data types (contactpersoon, gebruik, koppeling) for unauthenticated users -- information leakage -6. **Fix wizard routing**: "toevoegen" buttons should route to gebruik flow, not publiceren flow (affects #316-#322) -7. **Fix referentiearchitectuur CMS pages** -- only "home" and "about" exist, all architecture routes broken (#160, #135) -8. **Fix name resolution** for module UUIDs in koppelingen -- causes UUID-only titles throughout the platform - -### Before Next Test Run (P2) -9. Fix organisation UUID mapping: ensure test-setup.sh creates register objects matching Nextcloud user org UUIDs -10. Create dienst and koppeling publications in test data so bezoeker can test #345, #347, #443, #448, #453 -11. Create at least one concept-status organisation to test #447 -12. Configure Piwik Pro analytics (srcUrl, dataLayerName, id) on test environment to verify #92 diff --git a/test-results/api/issues/105.md b/test-results/api/issues/105.md deleted file mode 100644 index a6629d76..00000000 --- a/test-results/api/issues/105.md +++ /dev/null @@ -1,23 +0,0 @@ -# #105 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #105 AC4: Authenticated user sees own gebruik -**Response Time:** 868ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #105 AC1: Aanbod-beheerder sees applicaties | PASS | 650ms | -| #105 AC5: Results include user's org and public Leverancier modules | PASS | 650ms | -| #105 AC2: Admin sees applicaties | PASS | 868ms | -| #105 AC3: Gebruik endpoint accessible | PASS | 82ms | -| #105 AC4: Authenticated user can access gebruik | PASS | 82ms | - diff --git a/test-results/api/issues/141.md b/test-results/api/issues/141.md deleted file mode 100644 index 044c61a3..00000000 --- a/test-results/api/issues/141.md +++ /dev/null @@ -1,26 +0,0 @@ -# #141 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #141 Merge: koppeling preservation -**Response Time:** 84ms - -## References - -- Issue description: [issues/141.md](../../issues/141.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #141 AC1: Multiple organisations exist for merge testing | PASS | 78ms | -| #141 AC2: Applications have organisation reference for merge | PASS | 84ms | -| #141 AC3: Applications have @self metadata for tracking | PASS | 84ms | -| #141 AC4: Koppelingen accessible for merge transfer | PASS | 83ms | -| #141 AC5: Koppelingen have module references | PASS | 83ms | -| #141 After merge, koppeling names resolve to readable names (not UUIDs) | PASS | 78ms | -| #141 After merge, koppeling count is available — total count returned | PASS | 78ms | - diff --git a/test-results/api/issues/144.md b/test-results/api/issues/144.md deleted file mode 100644 index 6cf4ae69..00000000 --- a/test-results/api/issues/144.md +++ /dev/null @@ -1,31 +0,0 @@ -# #144 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #144 Leverancier count: migration check -**Response Time:** 514ms - -## References - -- Issue description: [issues/144.md](../../issues/144.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #144 AC1: Search returns results | PASS | 393ms | -| #144 AC5: Results contain beschrijvingKort | PASS | 393ms | -| #144 AC8: Organisation names are readable text (not UUID) | PASS | 84ms | -| #144 AC2: Partial name search returns results | PASS | 132ms | -| #144 AC3: Facet data returned with results | PASS | 109ms | -| #144 AC4: Facets contain expected fields | PASS | 109ms | -| #144 AC5: Sorted results returned | PASS | 94ms | -| #144 AC6: No search filter returns results | PASS | 85ms | -| #144 AC7: Filtered search has fewer results than unfiltered | PASS | 103ms | -| #144 AC9: Authenticated search returns results with org context | PASS | 514ms | -| #144 Leverancier count matches migration source — at least 300 leveranciers exist | PASS | 87ms | -| #144 Leverancier count is reasonable — not more than 500 | PASS | 87ms | - diff --git a/test-results/api/issues/148.md b/test-results/api/issues/148.md deleted file mode 100644 index 810efd38..00000000 --- a/test-results/api/issues/148.md +++ /dev/null @@ -1,30 +0,0 @@ -# #148 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #148 AC7: Elements have type and name properties -**Response Time:** 501ms - -## References - -- Issue description: [issues/148.md](../../issues/148.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #148 AC1: Views endpoint returns 200 | PASS | 335ms | -| #148: Views returns results array | PASS | 335ms | -| #148: Views count > 0 | PASS | 335ms | -| #148: Response includes total count | PASS | 335ms | -| #148: Single view accessible | PASS | 97ms | -| #148 AC3: Elements endpoint returns data | PASS | 82ms | -| #148 AC4: Elements have type information | PASS | 82ms | -| #148 AC5: Relations endpoint returns data | PASS | 82ms | -| #148 AC6: Registers endpoint lists available registers | PASS | 501ms | -| #148 AC7: Elements have identifier property | PASS | 90ms | -| #148 AC8: Elements omit empty properties | PASS | 90ms | - diff --git a/test-results/api/issues/15.md b/test-results/api/issues/15.md deleted file mode 100644 index 595bbc8a..00000000 --- a/test-results/api/issues/15.md +++ /dev/null @@ -1,22 +0,0 @@ -# #15 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #15 AC4: Export scoped to user org -**Response Time:** 12877ms - -## References - -- Issue description: [issues/15.md](../../issues/15.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #15: Export endpoint accessible | PASS | 3508ms | -| #15 AC2: Export accessible for gebruik-beheerder | PASS | 12877ms | -| #15 AC4: Export for jan accessible | PASS | 11115ms | - diff --git a/test-results/api/issues/155.md b/test-results/api/issues/155.md deleted file mode 100644 index 31250caa..00000000 --- a/test-results/api/issues/155.md +++ /dev/null @@ -1,23 +0,0 @@ -# #155 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #155 AC1: Glossary endpoint returns terms -**Response Time:** 109ms - -## References - -- Issue description: [issues/155.md](../../issues/155.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #155 AC2: Glossary search accessible | PASS | 81ms | -| #155 AC3: Glossary has terms | PASS | 86ms | -| #155 AC4: Glossary search is case-insensitive | PASS | 86ms | -| #155 AC1: Glossary endpoint returns data | PASS | 109ms | - diff --git a/test-results/api/issues/160.md b/test-results/api/issues/160.md deleted file mode 100644 index 83905fcb..00000000 --- a/test-results/api/issues/160.md +++ /dev/null @@ -1,22 +0,0 @@ -# #160 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #160 AC1: View payload size reasonable with _unset=xml -**Response Time:** 310ms - -## References - -- Issue description: [issues/160.md](../../issues/160.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #160 AC5: Backend API returns view data <500ms | PASS | 296ms | -| #160: Views response contains results array | PASS | 296ms | -| #160 AC1: Filtered views payload size < 500KB | PASS | 310ms | - diff --git a/test-results/api/issues/169.md b/test-results/api/issues/169.md deleted file mode 100644 index 99ed62ff..00000000 --- a/test-results/api/issues/169.md +++ /dev/null @@ -1,23 +0,0 @@ -# #169 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #169 AC1: NC organisations endpoint accessible -**Response Time:** 91ms - -## References - -- Issue description: [issues/169.md](../../issues/169.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #169 AC3: NC organisations have status info | PASS | 68ms | -| #169 AC4: Organisation objects have name and uuid | PASS | 68ms | -| #169 AC1: Nextcloud organisations accessible | PASS | 91ms | -| #169 AC2: Organisations have required fields | PASS | 91ms | - diff --git a/test-results/api/issues/186.md b/test-results/api/issues/186.md deleted file mode 100644 index ec94d7bd..00000000 --- a/test-results/api/issues/186.md +++ /dev/null @@ -1,22 +0,0 @@ -# #186 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #186 AC2: Koppelingen detail has module references -**Response Time:** 642ms - -## References - -- Issue description: [issues/186.md](../../issues/186.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #186 AC1: Koppeling names are readable (not blank/UUID) | PASS | 642ms | -| #186 AC2: Koppelingen have moduleA/moduleB fields | PASS | 82ms | -| #186 AC3: Koppeling has naam for display | PASS | 82ms | - diff --git a/test-results/api/issues/187.md b/test-results/api/issues/187.md deleted file mode 100644 index 57a72c73..00000000 --- a/test-results/api/issues/187.md +++ /dev/null @@ -1,20 +0,0 @@ -# #187 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #187 AC1: Contact person definition accessible -**Response Time:** 78ms - -## References - -- Issue description: [issues/187.md](../../issues/187.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #187 AC1: Contact person schema accessible | PASS | 78ms | - diff --git a/test-results/api/issues/208.md b/test-results/api/issues/208.md deleted file mode 100644 index 3fe87994..00000000 --- a/test-results/api/issues/208.md +++ /dev/null @@ -1,19 +0,0 @@ -# #208 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #208 AC1: Table view shows naam and type -**Response Time:** 89ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #208 AC1: Applications have naam for table display | PASS | 89ms | - diff --git a/test-results/api/issues/225.md b/test-results/api/issues/225.md deleted file mode 100644 index ba342570..00000000 --- a/test-results/api/issues/225.md +++ /dev/null @@ -1,22 +0,0 @@ -# #225 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #225 AC3: Authenticated sees more org fields -**Response Time:** 87ms - -## References - -- Issue description: [issues/225.md](../../issues/225.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #225 AC1: Public can access organisations | PASS | 81ms | -| #225 AC2: Public organisations have limited fields | PASS | 81ms | -| #225 AC3: Authenticated org listing accessible | PASS | 87ms | - diff --git a/test-results/api/issues/23.md b/test-results/api/issues/23.md deleted file mode 100644 index 8d8f1c6c..00000000 --- a/test-results/api/issues/23.md +++ /dev/null @@ -1,25 +0,0 @@ -# #23 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #23 AC5: Contactpersonen present -**Response Time:** 955ms - -## References - -- Issue description: [issues/23.md](../../issues/23.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #23 AC2: Applications searchable | PASS | 550ms | -| #23 AC9: Org names are text (not UUID) | PASS | 955ms | -| #23 AC1: Organisations present in new system | PASS | 79ms | -| #23 AC3: Diensten present in new system | PASS | 75ms | -| #23 AC4: Koppelingen present in new system | PASS | 79ms | -| #23 AC5: Contactpersonen present in new system | PASS | 79ms | - diff --git a/test-results/api/issues/231.md b/test-results/api/issues/231.md deleted file mode 100644 index dd10a53c..00000000 --- a/test-results/api/issues/231.md +++ /dev/null @@ -1,21 +0,0 @@ -# #231 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #231 AC1: Views available for export -**Response Time:** 102ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #231 AC1: Views available for AMEF export | PASS | 102ms | -| #231 AC2: Views have xml field for export | PASS | 102ms | -| #231 AC3: Elements available for export relationship check | PASS | 102ms | - diff --git a/test-results/api/issues/266.md b/test-results/api/issues/266.md deleted file mode 100644 index cdd96e9b..00000000 --- a/test-results/api/issues/266.md +++ /dev/null @@ -1,23 +0,0 @@ -# #266 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #266 AC1: /api/me returns firstName -**Response Time:** 594ms - -## References - -- Issue description: [issues/266.md](../../issues/266.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #266 AC5: /api/me returns correct personal data | PASS | 528ms | -| #266: User/me returns profile data | PASS | 594ms | -| #266 AC1: /api/me returns firstName field | PASS | 72ms | -| #266 AC2: /api/me returns email | PASS | 72ms | - diff --git a/test-results/api/issues/278.md b/test-results/api/issues/278.md deleted file mode 100644 index 60ebbd5d..00000000 --- a/test-results/api/issues/278.md +++ /dev/null @@ -1,21 +0,0 @@ -# #278 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #278 AC1: Filter values are readable strings -**Response Time:** 97ms - -## References - -- Issue description: [issues/278.md](../../issues/278.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #278 AC1: Facets returned with results | PASS | 97ms | -| #278 AC2: geregistreerdDoor facet has buckets | PASS | 97ms | - diff --git a/test-results/api/issues/280.md b/test-results/api/issues/280.md deleted file mode 100644 index 105af423..00000000 --- a/test-results/api/issues/280.md +++ /dev/null @@ -1,22 +0,0 @@ -# #280 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #280 AC3: Page 2 continues sort order -**Response Time:** 94ms - -## References - -- Issue description: [issues/280.md](../../issues/280.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #280 AC1: Sort parameter accepted | PASS | 94ms | -| #280 AC2: Sorted page 1 accessible | PASS | 88ms | -| #280 AC3: Page 2 first item follows page 1 last item | PASS | 78ms | - diff --git a/test-results/api/issues/286.md b/test-results/api/issues/286.md deleted file mode 100644 index 6ace53b2..00000000 --- a/test-results/api/issues/286.md +++ /dev/null @@ -1,21 +0,0 @@ -# #286 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #286 AC4: Login with current password succeeds -**Response Time:** 841ms - -## References - -- Issue description: [issues/286.md](../../issues/286.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #286 AC4: User can log in with password | PASS | 841ms | -| #286 AC4: Server responds with 2xx | PASS | 841ms | - diff --git a/test-results/api/issues/300.md b/test-results/api/issues/300.md deleted file mode 100644 index 5708d05f..00000000 --- a/test-results/api/issues/300.md +++ /dev/null @@ -1,20 +0,0 @@ -# #300 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #300 AC1-4: Jan's app count is correct -**Response Time:** 99ms - -## References - -- Issue description: [issues/300.md](../../issues/300.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #300 AC4: Returned objects are valid and accessible | PASS | 99ms | - diff --git a/test-results/api/issues/302.md b/test-results/api/issues/302.md deleted file mode 100644 index 2ae2d063..00000000 --- a/test-results/api/issues/302.md +++ /dev/null @@ -1,20 +0,0 @@ -# #302 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #302 AC1: Application fields populated after load -**Response Time:** 86ms - -## References - -- Issue description: [issues/302.md](../../issues/302.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #302 AC1: Applications have populated fields | PASS | 86ms | - diff --git a/test-results/api/issues/306.md b/test-results/api/issues/306.md deleted file mode 100644 index 23203741..00000000 --- a/test-results/api/issues/306.md +++ /dev/null @@ -1,20 +0,0 @@ -# #306 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #306 AC1: Diensten have clean labels -**Response Time:** 81ms - -## References - -- Issue description: [issues/306.md](../../issues/306.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #306 AC1: Diensten have naam field | PASS | 81ms | - diff --git a/test-results/api/issues/307.md b/test-results/api/issues/307.md deleted file mode 100644 index cc148692..00000000 --- a/test-results/api/issues/307.md +++ /dev/null @@ -1,20 +0,0 @@ -# #307 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #307 AC1-2: Jan's diensten scoped to own org -**Response Time:** 113ms - -## References - -- Issue description: [issues/307.md](../../issues/307.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #307 AC1: Diensten are accessible to user | PASS | 113ms | - diff --git a/test-results/api/issues/308.md b/test-results/api/issues/308.md deleted file mode 100644 index 2e74c1ed..00000000 --- a/test-results/api/issues/308.md +++ /dev/null @@ -1,20 +0,0 @@ -# #308 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #306 AC1: Diensten have clean labels -**Response Time:** 81ms - -## References - -- Issue description: [issues/308.md](../../issues/308.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #308 AC1: Diensten have expected fields | PASS | 81ms | - diff --git a/test-results/api/issues/312.md b/test-results/api/issues/312.md deleted file mode 100644 index ea0d551d..00000000 --- a/test-results/api/issues/312.md +++ /dev/null @@ -1,24 +0,0 @@ -# #312 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #312 AC4: Koppelingen with names retain them -**Response Time:** 216ms - -## References - -- Issue description: [issues/312.md](../../issues/312.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #312 AC1: Koppelingen have naam field | PASS | 79ms | -| #312 AC2: Koppeling names are non-empty | PASS | 79ms | -| #312 AC3: Most koppelingen have non-UUID names | PASS | 79ms | -| #312 AC4: Non-empty koppeling names exist | PASS | 216ms | -| #312 AC5: Koppelingen with moduleA have populated field | PASS | 216ms | - diff --git a/test-results/api/issues/314.md b/test-results/api/issues/314.md deleted file mode 100644 index f2980b8e..00000000 --- a/test-results/api/issues/314.md +++ /dev/null @@ -1,23 +0,0 @@ -# #314 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #314 AC3: Search apps by name in wizard context -**Response Time:** 114ms - -## References - -- Issue description: [issues/314.md](../../issues/314.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #314 AC1: User can list applications for koppeling wizard | PASS | 95ms | -| #314 AC2: Authenticated user can list applications | PASS | 95ms | -| #314 AC3: Search within wizard context works | PASS | 114ms | -| #314 AC4: Search returns results array | PASS | 114ms | - diff --git a/test-results/api/issues/315.md b/test-results/api/issues/315.md deleted file mode 100644 index 822e3287..00000000 --- a/test-results/api/issues/315.md +++ /dev/null @@ -1,27 +0,0 @@ -# #315 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #315 AC8: Single app detail shows correct supplier -**Response Time:** 96ms - -## References - -- Issue description: [issues/315.md](../../issues/315.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #315 AC1: Filter returns only leveranciers | PASS | 89ms | -| #315 AC4: Applicatie has geregistreerdDoor field | PASS | 96ms | -| #315 AC2: Public applicaties accessible | PASS | 90ms | -| #315 AC3: Admin sees apps from all geregistreerdDoor types | PASS | 88ms | -| #315 AC5: Admin total exceeds or equals public total | PASS | 91ms | -| #315 AC6: Public apps have geregistreerdDoor field | PASS | 88ms | -| #315 AC7: geregistreerdDoor is readable string not UUID | PASS | 88ms | -| #315 AC8: App detail has supplier info | PASS | 88ms | - diff --git a/test-results/api/issues/316.md b/test-results/api/issues/316.md deleted file mode 100644 index 7eee4fdb..00000000 --- a/test-results/api/issues/316.md +++ /dev/null @@ -1,19 +0,0 @@ -# #316 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #324 AC1: Gebruik objects have expected fields -**Response Time:** 83ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #316 AC1: Gebruik schema supports search | PASS | 83ms | - diff --git a/test-results/api/issues/317.md b/test-results/api/issues/317.md deleted file mode 100644 index d6d4d0d3..00000000 --- a/test-results/api/issues/317.md +++ /dev/null @@ -1,19 +0,0 @@ -# #317 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #324 AC1: Gebruik objects have expected fields -**Response Time:** 83ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #317 AC1: Gebruik has valid structure | PASS | 83ms | - diff --git a/test-results/api/issues/319.md b/test-results/api/issues/319.md deleted file mode 100644 index 7cbe16f8..00000000 --- a/test-results/api/issues/319.md +++ /dev/null @@ -1,19 +0,0 @@ -# #319 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #319 AC1: Search koppelingen by name -**Response Time:** 93ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #319 AC1: Koppeling search returns results | PASS | 93ms | - diff --git a/test-results/api/issues/320.md b/test-results/api/issues/320.md deleted file mode 100644 index b3f58a71..00000000 --- a/test-results/api/issues/320.md +++ /dev/null @@ -1,21 +0,0 @@ -# #320 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #320 AC1: Koppelingen have status field -**Response Time:** 118ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #320 AC2: Koppelingen have status-related fields | PASS | 118ms | -| #320 AC3: Koppelingen have type categorization | PASS | 118ms | -| #320 AC1: Koppelingen have expected structure | PASS | 80ms | - diff --git a/test-results/api/issues/323.md b/test-results/api/issues/323.md deleted file mode 100644 index 25894fed..00000000 --- a/test-results/api/issues/323.md +++ /dev/null @@ -1,19 +0,0 @@ -# #323 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #323 AC1: Application search works -**Response Time:** 112ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #323 AC1: Application search in wizard context works | PASS | 112ms | - diff --git a/test-results/api/issues/324.md b/test-results/api/issues/324.md deleted file mode 100644 index b5ca4e83..00000000 --- a/test-results/api/issues/324.md +++ /dev/null @@ -1,21 +0,0 @@ -# #324 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #324 AC2: Gebruik objects have status field -**Response Time:** 103ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #324 AC1: Gebruik objects accessible | PASS | 83ms | -| #324 AC2: Gebruik objects accessible | PASS | 103ms | -| #324 AC3: Gebruik has valid structure | PASS | 103ms | - diff --git a/test-results/api/issues/325.md b/test-results/api/issues/325.md deleted file mode 100644 index c7f05082..00000000 --- a/test-results/api/issues/325.md +++ /dev/null @@ -1,19 +0,0 @@ -# #325 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #325 AC1: Reference components accessible -**Response Time:** 96ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #325 AC1: Applications with reference components accessible | PASS | 96ms | - diff --git a/test-results/api/issues/332.md b/test-results/api/issues/332.md deleted file mode 100644 index 48f75673..00000000 --- a/test-results/api/issues/332.md +++ /dev/null @@ -1,20 +0,0 @@ -# #332 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #332 AC5: Search respects user permissions -**Response Time:** 585ms - -## References - -- Issue description: [issues/332.md](../../issues/332.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #332: Authenticated search works | PASS | 585ms | - diff --git a/test-results/api/issues/333.md b/test-results/api/issues/333.md deleted file mode 100644 index e7ba75ed..00000000 --- a/test-results/api/issues/333.md +++ /dev/null @@ -1,22 +0,0 @@ -# #333 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #333 AC3: Referentiecomponent facet no UUIDs -**Response Time:** 372ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #333 AC1: Organisation facet values are readable | PASS | 88ms | -| #333 AC2: Type facet values are readable | PASS | 88ms | -| #333 AC3: referentieComponenten facet accessible | PASS | 372ms | -| #333 AC4: referentieComponenten buckets have readable labels | PASS | 372ms | - diff --git a/test-results/api/issues/336.md b/test-results/api/issues/336.md deleted file mode 100644 index 88137e12..00000000 --- a/test-results/api/issues/336.md +++ /dev/null @@ -1,19 +0,0 @@ -# #336 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #336 AC1: Objects have consistent identification -**Response Time:** 913ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #336 AC1: All applicaties have @self.id | PASS | 913ms | - diff --git a/test-results/api/issues/339.md b/test-results/api/issues/339.md deleted file mode 100644 index 12e172db..00000000 --- a/test-results/api/issues/339.md +++ /dev/null @@ -1,21 +0,0 @@ -# #339 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #339 AC1: Users endpoint accessible -**Response Time:** 192ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #339 AC2: Users list has multiple entries | PASS | 73ms | -| #339 AC3: User list response has OCS format | PASS | 73ms | -| #339 AC1: Users list accessible | PASS | 192ms | - diff --git a/test-results/api/issues/340.md b/test-results/api/issues/340.md deleted file mode 100644 index 1318bddf..00000000 --- a/test-results/api/issues/340.md +++ /dev/null @@ -1,21 +0,0 @@ -# #340 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #340 AC2: Sort applied after search filter -**Response Time:** 94ms - -## References - -- Issue description: [issues/340.md](../../issues/340.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #340 AC1: Default sort produces results | PASS | 94ms | -| #340 AC2: Search + sort combined works | PASS | 79ms | - diff --git a/test-results/api/issues/343.md b/test-results/api/issues/343.md deleted file mode 100644 index bc5f8603..00000000 --- a/test-results/api/issues/343.md +++ /dev/null @@ -1,23 +0,0 @@ -# #343 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #343 AC2: Filter koppelingen by type=intern -**Response Time:** 84ms - -## References - -- Issue description: [issues/343.md](../../issues/343.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #343: Koppelingen endpoint returns results | PASS | 74ms | -| #343 AC5: Koppelingen have koppelingType attribute | PASS | 74ms | -| #343 AC1: Filter by extern returns results | PASS | 82ms | -| #343 AC2: Filter by intern returns results | PASS | 84ms | - diff --git a/test-results/api/issues/344.md b/test-results/api/issues/344.md deleted file mode 100644 index 5cace163..00000000 --- a/test-results/api/issues/344.md +++ /dev/null @@ -1,22 +0,0 @@ -# #344 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #344 AC2: Filter by specific reference component -**Response Time:** 94ms - -## References - -- Issue description: [issues/344.md](../../issues/344.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #344 AC3: Works for unauthenticated users | PASS | 79ms | -| #344 AC2: Reference component facet returns buckets | PASS | 94ms | -| #344 AC3: Multiple reference components available | PASS | 94ms | - diff --git a/test-results/api/issues/345.md b/test-results/api/issues/345.md deleted file mode 100644 index fc7de980..00000000 --- a/test-results/api/issues/345.md +++ /dev/null @@ -1,22 +0,0 @@ -# #345 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #345 AC1: Diensttype facet populated with values -**Response Time:** 82ms - -## References - -- Issue description: [issues/345.md](../../issues/345.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #345 AC5: Diensten endpoint returns results | PASS | 69ms | -| #345 AC2: Diensttype facet structure correct | PASS | 82ms | -| #345 AC3: Diensten schema returns only diensten | PASS | 82ms | - diff --git a/test-results/api/issues/346.md b/test-results/api/issues/346.md deleted file mode 100644 index cb013288..00000000 --- a/test-results/api/issues/346.md +++ /dev/null @@ -1,25 +0,0 @@ -# #346 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #346 AC5: Pagination with filter applied -**Response Time:** 83ms - -## References - -- Issue description: [issues/346.md](../../issues/346.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #346: Page 1 returns results | PASS | 83ms | -| #346 AC1: Page 2 shows different results than page 1 | PASS | 78ms | -| #346 AC3: Page 3 accessible | PASS | 79ms | -| #346 AC4: Total stays consistent across pages | PASS | 79ms | -| #346 AC5: Pagination works with filter | PASS | 82ms | -| #346 AC6: Pagination with sort maintains consistency | PASS | 82ms | - diff --git a/test-results/api/issues/347.md b/test-results/api/issues/347.md deleted file mode 100644 index dab1bdb4..00000000 --- a/test-results/api/issues/347.md +++ /dev/null @@ -1,20 +0,0 @@ -# #347 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #347 AC2: Dienst type values are readable -**Response Time:** 85ms - -## References - -- Issue description: [issues/347.md](../../issues/347.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #347 AC2: Diensttype values are human-readable | PASS | 85ms | - diff --git a/test-results/api/issues/348.md b/test-results/api/issues/348.md deleted file mode 100644 index 45060689..00000000 --- a/test-results/api/issues/348.md +++ /dev/null @@ -1,21 +0,0 @@ -# #348 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #348 AC1: Applications have standaardversies data -**Response Time:** 87ms - -## References - -- Issue description: [issues/348.md](../../issues/348.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #348 AC1: Applications accessible for standards check | PASS | 87ms | -| #348 AC2: Public can view application standards | PASS | 87ms | - diff --git a/test-results/api/issues/349.md b/test-results/api/issues/349.md deleted file mode 100644 index d17810bb..00000000 --- a/test-results/api/issues/349.md +++ /dev/null @@ -1,22 +0,0 @@ -# #349 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #349 Standaardversies facet: no UUIDs -**Response Time:** 100ms - -## References - -- Issue description: [issues/349.md](../../issues/349.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #349 AC1: Standards facet accessible | PASS | 81ms | -| #349 AC2: Standards facet values not UUIDs | PASS | 81ms | -| #349 Standaardversies facet returns readable names — no UUID labels in facet buckets | PASS | 100ms | - diff --git a/test-results/api/issues/352.md b/test-results/api/issues/352.md deleted file mode 100644 index c076bf1b..00000000 --- a/test-results/api/issues/352.md +++ /dev/null @@ -1,22 +0,0 @@ -# #352 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #352 AC2: Updated name reflected in contact person -**Response Time:** 458ms - -## References - -- Issue description: [issues/352.md](../../issues/352.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #352: Name update succeeds | PASS | 458ms | -| #352 AC3: No cache clearing needed - name appears | PASS | 78ms | -| #352 AC2: Contact persons accessible for sync check | PASS | 85ms | - diff --git a/test-results/api/issues/353.md b/test-results/api/issues/353.md deleted file mode 100644 index 1cc43b48..00000000 --- a/test-results/api/issues/353.md +++ /dev/null @@ -1,22 +0,0 @@ -# #353 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #353 AC1: /api/user/me has functie field -**Response Time:** 422ms - -## References - -- Issue description: [issues/353.md](../../issues/353.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #353: Functie update succeeds | PASS | 422ms | -| #353 AC1: Updated functie shows immediately | PASS | 76ms | -| #353 AC1: /api/me includes functie | PASS | 80ms | - diff --git a/test-results/api/issues/354.md b/test-results/api/issues/354.md deleted file mode 100644 index 0ad6e73a..00000000 --- a/test-results/api/issues/354.md +++ /dev/null @@ -1,26 +0,0 @@ -# #354 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #354 AC6: Consistent search results -**Response Time:** 155ms - -## References - -- Issue description: [issues/354.md](../../issues/354.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #354 AC1: Partial search on diensten works | PASS | 82ms | -| #354 AC2: Substring search returns matching results | PASS | 112ms | -| #354 AC3: Search with limit=40 returns up to 40 results | PASS | 90ms | -| #354 AC4: Partial/substring matching works | PASS | 90ms | -| #354 AC1: App search returns results | PASS | 143ms | -| #354 AC5: Partial name search works | PASS | 143ms | -| #354 AC6: Repeated search returns identical results | PASS | 155ms | - diff --git a/test-results/api/issues/355.md b/test-results/api/issues/355.md deleted file mode 100644 index 7e1860ab..00000000 --- a/test-results/api/issues/355.md +++ /dev/null @@ -1,23 +0,0 @@ -# #355 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #355 AC1: Application data contains readable geregistreerdDoor -**Response Time:** 80ms - -## References - -- Issue description: [issues/355.md](../../issues/355.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #355 AC1: geregistreerdDoor is human-readable in API response | PASS | 80ms | -| #355 AC2: Application names are human-readable | PASS | 80ms | -| #355 AC3: Applications have display names for export | PASS | 80ms | -| #355 AC4: Data has both IDs and readable fields for re-import | PASS | 80ms | - diff --git a/test-results/api/issues/357.md b/test-results/api/issues/357.md deleted file mode 100644 index 807258bc..00000000 --- a/test-results/api/issues/357.md +++ /dev/null @@ -1,21 +0,0 @@ -# #357 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #357 AC1: Dienst type values are consistent -**Response Time:** 82ms - -## References - -- Issue description: [issues/357.md](../../issues/357.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #357 AC1: Diensttype facet has no test values | PASS | 82ms | -| #357 AC2: Diensttype values are readable | PASS | 82ms | - diff --git a/test-results/api/issues/358.md b/test-results/api/issues/358.md deleted file mode 100644 index 54da168d..00000000 --- a/test-results/api/issues/358.md +++ /dev/null @@ -1,20 +0,0 @@ -# #358 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #358 AC1: Public search does not return concept-status items -**Response Time:** 94ms - -## References - -- Issue description: [issues/358.md](../../issues/358.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #358 AC1: No concept-status items in public results | PASS | 94ms | - diff --git a/test-results/api/issues/359.md b/test-results/api/issues/359.md deleted file mode 100644 index 7bb84306..00000000 --- a/test-results/api/issues/359.md +++ /dev/null @@ -1,20 +0,0 @@ -# #359 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #359 AC1: App configuration endpoint accessible -**Response Time:** 61ms - -## References - -- Issue description: [issues/359.md](../../issues/359.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #359 AC1: Configuration endpoint responds | PASS | 61ms | - diff --git a/test-results/api/issues/360.md b/test-results/api/issues/360.md deleted file mode 100644 index ec0c9e7c..00000000 --- a/test-results/api/issues/360.md +++ /dev/null @@ -1,20 +0,0 @@ -# #360 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #360 AC1: Configuration persists via API -**Response Time:** 60ms - -## References - -- Issue description: [issues/360.md](../../issues/360.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #360 AC1: Config endpoint available for persistence | PASS | 60ms | - diff --git a/test-results/api/issues/363.md b/test-results/api/issues/363.md deleted file mode 100644 index f6dc08d2..00000000 --- a/test-results/api/issues/363.md +++ /dev/null @@ -1,21 +0,0 @@ -# #363 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #363 AC1: API responses use consistent terminology -**Response Time:** 92ms - -## References - -- Issue description: [issues/363.md](../../issues/363.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #363 AC1: No standalone catalogus in API response | PASS | 92ms | -| #363 AC2: No space-separated software catalogus | PASS | 92ms | - diff --git a/test-results/api/issues/364.md b/test-results/api/issues/364.md deleted file mode 100644 index 8948881c..00000000 --- a/test-results/api/issues/364.md +++ /dev/null @@ -1,21 +0,0 @@ -# #364 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #364 AC1: Contact persons have email field -**Response Time:** 87ms - -## References - -- Issue description: [issues/364.md](../../issues/364.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #364 AC1: Contact persons accessible | PASS | 87ms | -| #364 AC2: Contact persons with email have non-empty value | PASS | 87ms | - diff --git a/test-results/api/issues/365.md b/test-results/api/issues/365.md deleted file mode 100644 index e6de7bcc..00000000 --- a/test-results/api/issues/365.md +++ /dev/null @@ -1,23 +0,0 @@ -# #365 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #365 AC2: Contact person has rol field -**Response Time:** 358ms - -## References - -- Issue description: [issues/365.md](../../issues/365.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #365 AC1: Editing does NOT produce 400 error | PASS | 358ms | -| #365 AC3: Changes visible after saving | PASS | 211ms | -| #365 AC4: Contacts without rol still valid | PASS | 86ms | -| #365 AC2: Contact persons have expected structure | PASS | 81ms | - diff --git a/test-results/api/issues/366.md b/test-results/api/issues/366.md deleted file mode 100644 index 4bc1f94f..00000000 --- a/test-results/api/issues/366.md +++ /dev/null @@ -1,21 +0,0 @@ -# #366 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #366 AC1: Contact persons have consistent rol field -**Response Time:** 88ms - -## References - -- Issue description: [issues/366.md](../../issues/366.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #366 AC1: Contacts have rol field for role checking | PASS | 88ms | -| #366 AC2: Role values are valid strings | PASS | 88ms | - diff --git a/test-results/api/issues/367.md b/test-results/api/issues/367.md deleted file mode 100644 index 48c00eb2..00000000 --- a/test-results/api/issues/367.md +++ /dev/null @@ -1,20 +0,0 @@ -# #367 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #367 AC1: Contact persons have naam field -**Response Time:** 77ms - -## References - -- Issue description: [issues/367.md](../../issues/367.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #367 AC1: Contacts have readable naam | PASS | 77ms | - diff --git a/test-results/api/issues/368.md b/test-results/api/issues/368.md deleted file mode 100644 index 1e8bb73d..00000000 --- a/test-results/api/issues/368.md +++ /dev/null @@ -1,22 +0,0 @@ -# #368 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #368 AC1: Koppelingen have valid richting values -**Response Time:** 80ms - -## References - -- Issue description: [issues/368.md](../../issues/368.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #368 AC1: Richting field not default Richting placeholder | PASS | 80ms | -| #368 AC2: Valid richting values only | PASS | 80ms | -| #368 AC3: Existing koppelingen without richting handled gracefully | PASS | 80ms | - diff --git a/test-results/api/issues/369.md b/test-results/api/issues/369.md deleted file mode 100644 index 392dd6b6..00000000 --- a/test-results/api/issues/369.md +++ /dev/null @@ -1,21 +0,0 @@ -# #369 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #369 AC1: Created koppelingen visible in list -**Response Time:** 84ms - -## References - -- Issue description: [issues/369.md](../../issues/369.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #369 AC1: Recently created koppelingen appear in list | PASS | 84ms | -| #369 AC2: Koppelingen have application name and type fields | PASS | 84ms | - diff --git a/test-results/api/issues/370.md b/test-results/api/issues/370.md deleted file mode 100644 index 109671a3..00000000 --- a/test-results/api/issues/370.md +++ /dev/null @@ -1,22 +0,0 @@ -# #370 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #370 AC1: Application objects have expected fields -**Response Time:** 88ms - -## References - -- Issue description: [issues/370.md](../../issues/370.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #370 AC1: Applications have naam field | PASS | 88ms | -| #370 AC2: Applications have geregistreerdDoor field | PASS | 88ms | -| #370 AC3: Application naam is a non-empty string | PASS | 88ms | - diff --git a/test-results/api/issues/371.md b/test-results/api/issues/371.md deleted file mode 100644 index 52035b1c..00000000 --- a/test-results/api/issues/371.md +++ /dev/null @@ -1,20 +0,0 @@ -# #371 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #371 AC1: Compliance column no longer in list response -**Response Time:** 86ms - -## References - -- Issue description: [issues/371.md](../../issues/371.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #371 AC1: Application list valid (compliance column removed per #430) | PASS | 86ms | - diff --git a/test-results/api/issues/373.md b/test-results/api/issues/373.md deleted file mode 100644 index 65cfa276..00000000 --- a/test-results/api/issues/373.md +++ /dev/null @@ -1,21 +0,0 @@ -# #373 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #373 AC2: Diensten reference applicaties -**Response Time:** 83ms - -## References - -- Issue description: [issues/373.md](../../issues/373.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #373 AC1: Diensten data accessible | PASS | 83ms | -| #373 AC2: Diensten have data structure for app linking | PASS | 77ms | - diff --git a/test-results/api/issues/374.md b/test-results/api/issues/374.md deleted file mode 100644 index 05efac52..00000000 --- a/test-results/api/issues/374.md +++ /dev/null @@ -1,20 +0,0 @@ -# #374 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #374 AC1: Standards references use readable format -**Response Time:** 115ms - -## References - -- Issue description: [issues/374.md](../../issues/374.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #374 AC1: Standards references accessible in readable format | PASS | 115ms | - diff --git a/test-results/api/issues/375.md b/test-results/api/issues/375.md deleted file mode 100644 index 7ea99c8f..00000000 --- a/test-results/api/issues/375.md +++ /dev/null @@ -1,21 +0,0 @@ -# #375 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #375 AC2: Applications have type field for version categorization -**Response Time:** 88ms - -## References - -- Issue description: [issues/375.md](../../issues/375.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #375 AC1: Applications have type information | PASS | 84ms | -| #375 AC2: Type facet available for version categorization | PASS | 88ms | - diff --git a/test-results/api/issues/377.md b/test-results/api/issues/377.md deleted file mode 100644 index 05b8eb12..00000000 --- a/test-results/api/issues/377.md +++ /dev/null @@ -1,20 +0,0 @@ -# #377 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #373 AC2: Diensten reference applicaties -**Response Time:** 77ms - -## References - -- Issue description: [issues/377.md](../../issues/377.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #377 AC1: Diensten schema accessible for relationship check | PASS | 77ms | - diff --git a/test-results/api/issues/378.md b/test-results/api/issues/378.md deleted file mode 100644 index 038e8ca5..00000000 --- a/test-results/api/issues/378.md +++ /dev/null @@ -1,21 +0,0 @@ -# #378 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #378 AC2: GET and verify field structure before edit -**Response Time:** 89ms - -## References - -- Issue description: [issues/378.md](../../issues/378.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #378 AC1: Fetch application for edit test | PASS | 89ms | -| #378 AC2: Application has standards-related fields | PASS | 80ms | - diff --git a/test-results/api/issues/379.md b/test-results/api/issues/379.md deleted file mode 100644 index 735a1b04..00000000 --- a/test-results/api/issues/379.md +++ /dev/null @@ -1,22 +0,0 @@ -# #379 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #379 AC2: Authenticated shows same app data -**Response Time:** 93ms - -## References - -- Issue description: [issues/379.md](../../issues/379.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #379 AC1: Public standards data accessible | PASS | 93ms | -| #379 AC2: Authenticated app data accessible | PASS | 83ms | -| #379 AC3: Public and auth return same total for public apps | PASS | 83ms | - diff --git a/test-results/api/issues/380.md b/test-results/api/issues/380.md deleted file mode 100644 index 3a4c5de6..00000000 --- a/test-results/api/issues/380.md +++ /dev/null @@ -1,21 +0,0 @@ -# #380 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #380 AC2: Repeated query returns same total -**Response Time:** 97ms - -## References - -- Issue description: [issues/380.md](../../issues/380.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #380 AC1: Total count available for consistency checking | PASS | 85ms | -| #380 AC2: Count consistent across repeated queries | PASS | 97ms | - diff --git a/test-results/api/issues/381.md b/test-results/api/issues/381.md deleted file mode 100644 index 9f9c5757..00000000 --- a/test-results/api/issues/381.md +++ /dev/null @@ -1,21 +0,0 @@ -# #381 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #381 AC1: No 'non-compliant' in API responses -**Response Time:** 934ms - -## References - -- Issue description: [issues/381.md](../../issues/381.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #381 AC1: No 'non-compliant' in response | PASS | 934ms | -| #381 AC6: No 'Compliant' (English) in response | PASS | 934ms | - diff --git a/test-results/api/issues/382.md b/test-results/api/issues/382.md deleted file mode 100644 index 535d89dd..00000000 --- a/test-results/api/issues/382.md +++ /dev/null @@ -1,20 +0,0 @@ -# #382 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #382 AC2-3: URL handling for standards -**Response Time:** 266ms - -## References - -- Issue description: [issues/382.md](../../issues/382.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #382: URL field saved correctly | PASS | 266ms | - diff --git a/test-results/api/issues/383.md b/test-results/api/issues/383.md deleted file mode 100644 index dfcf96d8..00000000 --- a/test-results/api/issues/383.md +++ /dev/null @@ -1,20 +0,0 @@ -# #383 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #383 AC1: Export endpoint respects limit parameter -**Response Time:** 87ms - -## References - -- Issue description: [issues/383.md](../../issues/383.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #383 AC1: Export scoping — limit parameter restricts results | PASS | 87ms | - diff --git a/test-results/api/issues/384.md b/test-results/api/issues/384.md deleted file mode 100644 index 43539ab0..00000000 --- a/test-results/api/issues/384.md +++ /dev/null @@ -1,20 +0,0 @@ -# #384 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #384 AC1: GET returns all fields for edit pre-fill -**Response Time:** 80ms - -## References - -- Issue description: [issues/384.md](../../issues/384.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #384 AC1: Application GET returns full data for editing | PASS | 80ms | - diff --git a/test-results/api/issues/385.md b/test-results/api/issues/385.md deleted file mode 100644 index e6917649..00000000 --- a/test-results/api/issues/385.md +++ /dev/null @@ -1,20 +0,0 @@ -# #385 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #385 AC1: Applications have version-related fields -**Response Time:** 99ms - -## References - -- Issue description: [issues/385.md](../../issues/385.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #385 AC1: Applications accessible with version fields | PASS | 99ms | - diff --git a/test-results/api/issues/391.md b/test-results/api/issues/391.md deleted file mode 100644 index 19303577..00000000 --- a/test-results/api/issues/391.md +++ /dev/null @@ -1,22 +0,0 @@ -# #391 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #391 AC1: Organisation users endpoint accessible -**Response Time:** 92ms - -## References - -- Issue description: [issues/391.md](../../issues/391.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #391 AC2: Contact persons list for activation candidates | PASS | 89ms | -| #391 AC3: Contacts have expected fields for activation | PASS | 89ms | -| #391 AC1: Organisations endpoint for user management | PASS | 92ms | - diff --git a/test-results/api/issues/392.md b/test-results/api/issues/392.md deleted file mode 100644 index 21bf7a87..00000000 --- a/test-results/api/issues/392.md +++ /dev/null @@ -1,23 +0,0 @@ -# #392 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #392 AC1: Contact persons with email accessible -**Response Time:** 76ms - -## References - -- Issue description: [issues/392.md](../../issues/392.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #392 AC3: Organisations accessible for user conversion | PASS | 72ms | -| #392 AC4: Organisation structure supports user management | PASS | 72ms | -| #392 AC1: Contact persons accessible for conversion check | PASS | 76ms | -| #392 AC2: Contact persons have expected structure | PASS | 76ms | - diff --git a/test-results/api/issues/393.md b/test-results/api/issues/393.md deleted file mode 100644 index 8be16604..00000000 --- a/test-results/api/issues/393.md +++ /dev/null @@ -1,24 +0,0 @@ -# #393 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #393 AC3: Export endpoint for diensten -**Response Time:** 624ms - -## References - -- Issue description: [issues/393.md](../../issues/393.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #393 AC5: No 500 errors | PASS | 624ms | -| #393 AC1: Registers endpoint returns data | PASS | 199ms | -| #393 AC2: Schemas endpoint returns data | PASS | 95ms | -| #393 AC3: Diensten export accessible | PASS | 208ms | -| #393 AC4: Export per schema works | PASS | 208ms | - diff --git a/test-results/api/issues/394.md b/test-results/api/issues/394.md deleted file mode 100644 index 1ff2ff21..00000000 --- a/test-results/api/issues/394.md +++ /dev/null @@ -1,25 +0,0 @@ -# #394 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #394 AC4: User sees scoped contactpersonen -**Response Time:** 103ms - -## References - -- Issue description: [issues/394.md](../../issues/394.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #394 AC1: Public applicatie list accessible | PASS | 103ms | -| #394 AC2: Public results contain applicatie data | PASS | 103ms | -| #394 AC6: Authenticated user can see contacts | PASS | 87ms | -| #394 AC2: Public contactpersonen access limited | PASS | 85ms | -| #394 AC3: Admin can list all contactpersonen | PASS | 83ms | -| #394 AC4: User contactpersonen list accessible | PASS | 96ms | - diff --git a/test-results/api/issues/396.md b/test-results/api/issues/396.md deleted file mode 100644 index 46633915..00000000 --- a/test-results/api/issues/396.md +++ /dev/null @@ -1,22 +0,0 @@ -# #396 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #396 AC1: Nextcloud status endpoint -**Response Time:** 31ms - -## References - -- Issue description: [issues/396.md](../../issues/396.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #396 AC1: Nextcloud is running | PASS | 31ms | -| #396 AC4: Version info available | PASS | 31ms | -| #396 AC1: Nextcloud status accessible | PASS | 29ms | - diff --git a/test-results/api/issues/398.md b/test-results/api/issues/398.md deleted file mode 100644 index 659491d5..00000000 --- a/test-results/api/issues/398.md +++ /dev/null @@ -1,24 +0,0 @@ -# #398 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #398 Leveranciers facet: UUID check (re-opened) -**Response Time:** 124ms - -## References - -- Issue description: [issues/398.md](../../issues/398.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #398 AC1: geregistreerdDoor facet accessible | PASS | 90ms | -| #398 AC2: Facet includes Leverancier bucket | PASS | 90ms | -| #398 AC3: Facet buckets have label field | PASS | 124ms | -| #398 AC4: Facet values are human-readable supplier names | PASS | 124ms | -| #398 Leveranciers filter shows readable names — no UUID labels in geregistreerdDoor facet | PASS | 109ms | - diff --git a/test-results/api/issues/399.md b/test-results/api/issues/399.md deleted file mode 100644 index e15d10f9..00000000 --- a/test-results/api/issues/399.md +++ /dev/null @@ -1,21 +0,0 @@ -# #399 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #399 AC1: Different supplier apps visible to public -**Response Time:** 92ms - -## References - -- Issue description: [issues/399.md](../../issues/399.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #399 AC1: Public sees apps from multiple suppliers | PASS | 92ms | -| #399 AC2: Published apps accessible consistently | PASS | 92ms | - diff --git a/test-results/api/issues/400.md b/test-results/api/issues/400.md deleted file mode 100644 index 3bf5f1f4..00000000 --- a/test-results/api/issues/400.md +++ /dev/null @@ -1,23 +0,0 @@ -# #400 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #400 AC5: Data persisted correctly -**Response Time:** 250ms - -## References - -- Issue description: [issues/400.md](../../issues/400.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #400 AC2: Koppeling saved without error | PASS | 77ms | -| #400 AC3: Koppeling visible in list | PASS | 80ms | -| #400 AC4: Re-save works without errors | PASS | 250ms | -| #400 AC5: Data persisted correctly | PASS | 90ms | - diff --git a/test-results/api/issues/401.md b/test-results/api/issues/401.md deleted file mode 100644 index 1111b6ce..00000000 --- a/test-results/api/issues/401.md +++ /dev/null @@ -1,21 +0,0 @@ -# #401 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #401 AC1: Koppelingen have richting field -**Response Time:** 80ms - -## References - -- Issue description: [issues/401.md](../../issues/401.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #401 AC1: Koppelingen data structure valid | PASS | 80ms | -| #401 AC2: Koppelingen have moduleA and moduleB | PASS | 80ms | - diff --git a/test-results/api/issues/402.md b/test-results/api/issues/402.md deleted file mode 100644 index 6f183660..00000000 --- a/test-results/api/issues/402.md +++ /dev/null @@ -1,23 +0,0 @@ -# #402 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #402 AC2: Second identical request returns same data -**Response Time:** 96ms - -## References - -- Issue description: [issues/402.md](../../issues/402.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #402: API returns consistent data (no browser dependency) | PASS | 96ms | -| #402 AC1: API response is deterministic | PASS | 84ms | -| #402 AC2: Repeated request returns same total | PASS | 88ms | -| #402 AC3: Same first result on repeat | PASS | 88ms | - diff --git a/test-results/api/issues/403.md b/test-results/api/issues/403.md deleted file mode 100644 index 9a4c0460..00000000 --- a/test-results/api/issues/403.md +++ /dev/null @@ -1,20 +0,0 @@ -# #403 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #403 AC1: Koppelingen reference modules (dependency chain exists) -**Response Time:** 75ms - -## References - -- Issue description: [issues/403.md](../../issues/403.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #403 AC1: Dependency chain exists for delete prevention | PASS | 75ms | - diff --git a/test-results/api/issues/405.md b/test-results/api/issues/405.md deleted file mode 100644 index 1a165a42..00000000 --- a/test-results/api/issues/405.md +++ /dev/null @@ -1,20 +0,0 @@ -# #405 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #405 AC2: Application relations can be checked before delete -**Response Time:** 81ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #405 AC1: Can fetch application for dependency analysis | PASS | 81ms | -| #405 AC2: Can check koppelingen for dependency analysis | PASS | 77ms | - diff --git a/test-results/api/issues/406.md b/test-results/api/issues/406.md deleted file mode 100644 index 905b4f3a..00000000 --- a/test-results/api/issues/406.md +++ /dev/null @@ -1,21 +0,0 @@ -# #406 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #406 AC1-2: No siteimprove in page source -**Response Time:** 203ms - -## References - -- Issue description: [issues/406.md](../../issues/406.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #406 AC1: No siteimproveanalytics.com in response | PASS | 203ms | -| #406 AC2: No siteimprove references | PASS | 203ms | - diff --git a/test-results/api/issues/407.md b/test-results/api/issues/407.md deleted file mode 100644 index d2466b94..00000000 --- a/test-results/api/issues/407.md +++ /dev/null @@ -1,21 +0,0 @@ -# #407 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #407 AC1: Application standards accessible -**Response Time:** 87ms - -## References - -- Issue description: [issues/407.md](../../issues/407.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #407: No double 'id-id-' in standard links | PASS | 87ms | -| #407 AC1: Applications with standards data accessible | PASS | 82ms | - diff --git a/test-results/api/issues/409.md b/test-results/api/issues/409.md deleted file mode 100644 index aaf853f0..00000000 --- a/test-results/api/issues/409.md +++ /dev/null @@ -1,20 +0,0 @@ -# #409 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #409 AC1: Footer links in unauthenticated page -**Response Time:** 99ms - -## References - -- Issue description: [issues/409.md](../../issues/409.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #409: Page accessible without auth | PASS | 99ms | - diff --git a/test-results/api/issues/411.md b/test-results/api/issues/411.md deleted file mode 100644 index f75802f9..00000000 --- a/test-results/api/issues/411.md +++ /dev/null @@ -1,22 +0,0 @@ -# #411 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #411 AC3: Organisaties have website populated -**Response Time:** 81ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #411 AC1: Some applicaties have beschrijvingKort | PASS | 81ms | -| #411 AC2: Organisaties have website field | PASS | 81ms | -| #411 AC3: Organisaties accessible | PASS | 79ms | -| #411 AC4: Some organisaties have website | PASS | 79ms | - diff --git a/test-results/api/issues/413.md b/test-results/api/issues/413.md deleted file mode 100644 index 7aaedb49..00000000 --- a/test-results/api/issues/413.md +++ /dev/null @@ -1,21 +0,0 @@ -# #413 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #413 AC1: Views endpoint returns filtered views -**Response Time:** 339ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #413 AC1: Views endpoint returns results | PASS | 339ms | -| #413: Filter reduces result count (publiceren filter active) | PASS | 339ms | -| #413: Filtered views have no xml field (_unset=xml working) | PASS | 339ms | - diff --git a/test-results/api/issues/414.md b/test-results/api/issues/414.md deleted file mode 100644 index 288f322f..00000000 --- a/test-results/api/issues/414.md +++ /dev/null @@ -1,20 +0,0 @@ -# #414 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #414 AC2: Cross-org usage visibility -**Response Time:** 212ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #414: Deelnemers endpoint accessible | PASS | 212ms | -| #414 AC2: Gemeente user can see gebruik data | PASS | 82ms | - diff --git a/test-results/api/issues/417.md b/test-results/api/issues/417.md deleted file mode 100644 index efd0b34d..00000000 --- a/test-results/api/issues/417.md +++ /dev/null @@ -1,20 +0,0 @@ -# #417 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #391 AC2: Contact persons accessible for activation check -**Response Time:** 89ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #417 AC1: Contact persons have email for validation | PASS | 89ms | -| #417 AC2: Contact schema supports email field | PASS | 89ms | - diff --git a/test-results/api/issues/418.md b/test-results/api/issues/418.md deleted file mode 100644 index ccc16e9e..00000000 --- a/test-results/api/issues/418.md +++ /dev/null @@ -1,22 +0,0 @@ -# #418 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #418 AC2: Diensten list in single call -**Response Time:** 1011ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #418 AC1: Single API call returns apps | PASS | 1011ms | -| #418 AC2: No 404 errors | PASS | 1011ms | -| #418 AC2: Diensten batch load returns data | PASS | 86ms | -| #418 AC3: Diensten batch response time < 2s | PASS | 86ms | - diff --git a/test-results/api/issues/419.md b/test-results/api/issues/419.md deleted file mode 100644 index 3b90b3c9..00000000 --- a/test-results/api/issues/419.md +++ /dev/null @@ -1,20 +0,0 @@ -# #419 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #419 AC1: Standard version data accessible -**Response Time:** 670ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #419: Applicatie has standaardVersies field | PASS | 670ms | -| #419 AC1: Applications accessible for version check | PASS | 84ms | - diff --git a/test-results/api/issues/420.md b/test-results/api/issues/420.md deleted file mode 100644 index aea67afa..00000000 --- a/test-results/api/issues/420.md +++ /dev/null @@ -1,20 +0,0 @@ -# #420 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #420 AC2: Gemeente-beheerder sees aanbod -**Response Time:** 656ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #420: Aanbod endpoint returns results | PASS | 656ms | -| #420 AC2: Gemeente-beheerder aanbod accessible | PASS | 177ms | - diff --git a/test-results/api/issues/430.md b/test-results/api/issues/430.md deleted file mode 100644 index bf2a453b..00000000 --- a/test-results/api/issues/430.md +++ /dev/null @@ -1,20 +0,0 @@ -# #430 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #430 AC1: Application list response structure -**Response Time:** 81ms - -## References - -- Issue description: [issues/430.md](../../issues/430.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #430 AC1: Applications list returns valid data | PASS | 81ms | - diff --git a/test-results/api/issues/431.md b/test-results/api/issues/431.md deleted file mode 100644 index 679e7694..00000000 --- a/test-results/api/issues/431.md +++ /dev/null @@ -1,20 +0,0 @@ -# #431 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #431 AC1: /api/user/me has middleName field -**Response Time:** 89ms - -## References - -- Issue description: [issues/431.md](../../issues/431.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #431 AC1: /api/me supports middleName (tussenvoegsel) | PASS | 89ms | - diff --git a/test-results/api/issues/432.md b/test-results/api/issues/432.md deleted file mode 100644 index c82518b9..00000000 --- a/test-results/api/issues/432.md +++ /dev/null @@ -1,21 +0,0 @@ -# #432 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #432 AC2: Koppeling detail name matches list -**Response Time:** 91ms - -## References - -- Issue description: [issues/432.md](../../issues/432.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #432 AC1: Koppeling list has consistent names | PASS | 81ms | -| #432 AC2: Detail name matches list name | PASS | 91ms | - diff --git a/test-results/api/issues/433.md b/test-results/api/issues/433.md deleted file mode 100644 index ae8e2f35..00000000 --- a/test-results/api/issues/433.md +++ /dev/null @@ -1,21 +0,0 @@ -# #433 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #433 AC1: Koppelingen have expected fields populated -**Response Time:** 79ms - -## References - -- Issue description: [issues/433.md](../../issues/433.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #433 AC1: Koppelingen have moduleA field | PASS | 79ms | -| #433 AC2: Koppelingen have moduleB field | PASS | 79ms | - diff --git a/test-results/api/issues/434.md b/test-results/api/issues/434.md deleted file mode 100644 index 35e5d2b8..00000000 --- a/test-results/api/issues/434.md +++ /dev/null @@ -1,21 +0,0 @@ -# #434 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #434 AC2: Contact created for account holder -**Response Time:** 105ms - -## References - -- Issue description: [issues/434.md](../../issues/434.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #434 AC1: Contact persons list has entries | PASS | 105ms | -| #434 AC2: Contacts list includes account holder contacts | PASS | 87ms | - diff --git a/test-results/api/issues/435.md b/test-results/api/issues/435.md deleted file mode 100644 index 0545ef0b..00000000 --- a/test-results/api/issues/435.md +++ /dev/null @@ -1,24 +0,0 @@ -# #435 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #435 AC2: Leverancier filter returns expected apps -**Response Time:** 85ms - -## References - -- Issue description: [issues/435.md](../../issues/435.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #435: Unauth app count | PASS | 85ms | -| #435 AC6: Auth and unauth counts comparable | PASS | 78ms | -| #435 AC1: Leverancier apps count > 0 | PASS | 79ms | -| #435 AC2: Multiple leverancier apps imported | PASS | 79ms | -| #435 AC3: Import total is substantial | PASS | 79ms | - diff --git a/test-results/api/issues/436.md b/test-results/api/issues/436.md deleted file mode 100644 index 23d90774..00000000 --- a/test-results/api/issues/436.md +++ /dev/null @@ -1,23 +0,0 @@ -# #436 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #436 AC4: Public organisatie list returns 200 -**Response Time:** 80ms - -## References - -- Issue description: [issues/436.md](../../issues/436.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #436 AC1: Public applicatie list returns 200 (not 401) | PASS | 80ms | -| #436 AC2: Public response has results array | PASS | 80ms | -| #436 AC3: Public diensten list returns 200 (not 401) | PASS | 76ms | -| #436 AC4: Public organisatie list returns 200 (not 401) | PASS | 77ms | - diff --git a/test-results/api/issues/437.md b/test-results/api/issues/437.md deleted file mode 100644 index 2c068cf1..00000000 --- a/test-results/api/issues/437.md +++ /dev/null @@ -1,23 +0,0 @@ -# #437 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #437 AC3: Koppelingen have type field -**Response Time:** 84ms - -## References - -- Issue description: [issues/437.md](../../issues/437.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #437 AC1: Leverancier user can create koppeling | PASS | 84ms | -| #437 AC2: No 400 error | PASS | 84ms | -| #437 AC3: Koppelingen have type field populated | PASS | 81ms | -| #437 AC4: Koppelingen have status field | PASS | 81ms | - diff --git a/test-results/api/issues/438.md b/test-results/api/issues/438.md deleted file mode 100644 index 25f499ca..00000000 --- a/test-results/api/issues/438.md +++ /dev/null @@ -1,21 +0,0 @@ -# #438 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #438 AC1: Filter by specific diensttype -**Response Time:** 77ms - -## References - -- Issue description: [issues/438.md](../../issues/438.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #438 AC1: Diensttype filter returns results | PASS | 77ms | -| #438 AC2: Filtered diensten match requested type | PASS | 77ms | - diff --git a/test-results/api/issues/439.md b/test-results/api/issues/439.md deleted file mode 100644 index 0a5959c6..00000000 --- a/test-results/api/issues/439.md +++ /dev/null @@ -1,23 +0,0 @@ -# #439 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #439 AC4: Empty search doesn't cause errors -**Response Time:** 120ms - -## References - -- Issue description: [issues/439.md](../../issues/439.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #439 AC1: Overview returns 200 | PASS | 82ms | -| #439 AC2: Overview has valid JSON structure | PASS | 82ms | -| #439 AC3: No empty results when data exists | PASS | 82ms | -| #439 AC4: No-match search returns empty array (no error) | PASS | 120ms | - diff --git a/test-results/api/issues/440.md b/test-results/api/issues/440.md deleted file mode 100644 index a03990ef..00000000 --- a/test-results/api/issues/440.md +++ /dev/null @@ -1,23 +0,0 @@ -# #440 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #440 AC4: Filter by Community organisations -**Response Time:** 99ms - -## References - -- Issue description: [issues/440.md](../../issues/440.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #440: Filtering by Gemeente returns correct results | PASS | 72ms | -| #440: Filtering by Leverancier returns correct results | PASS | 79ms | -| #440: Filtering by Samenwerking returns correct results | PASS | 76ms | -| #440 AC4: Community filter returns only community orgs | PASS | 99ms | - diff --git a/test-results/api/issues/441.md b/test-results/api/issues/441.md deleted file mode 100644 index 2cc9a4c3..00000000 --- a/test-results/api/issues/441.md +++ /dev/null @@ -1,20 +0,0 @@ -# #441 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #441 AC1: Applications have version information -**Response Time:** 94ms - -## References - -- Issue description: [issues/441.md](../../issues/441.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #441 AC1: Applications accessible with version data | PASS | 94ms | - diff --git a/test-results/api/issues/442.md b/test-results/api/issues/442.md deleted file mode 100644 index 5c4b1e96..00000000 --- a/test-results/api/issues/442.md +++ /dev/null @@ -1,21 +0,0 @@ -# #442 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #378 AC2: GET and verify field structure before edit -**Response Time:** 88ms - -## References - -- Issue description: [issues/442.md](../../issues/442.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #442 AC1: Applications with document data accessible | PASS | 88ms | -| #442 AC2: Application fields accessible for document check | PASS | 80ms | - diff --git a/test-results/api/issues/443.md b/test-results/api/issues/443.md deleted file mode 100644 index e983bc3f..00000000 --- a/test-results/api/issues/443.md +++ /dev/null @@ -1,20 +0,0 @@ -# #443 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #443 AC3: Dienst API returns diensttypen as array -**Response Time:** 88ms - -## References - -- Issue description: [issues/443.md](../../issues/443.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #443 AC3: Dienst API returns diensttypen as array | PASS | 88ms | - diff --git a/test-results/api/issues/447.md b/test-results/api/issues/447.md deleted file mode 100644 index bf0c91fb..00000000 --- a/test-results/api/issues/447.md +++ /dev/null @@ -1,21 +0,0 @@ -# #447 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #447 AC3: Search excludes concept organisations (authenticated, non-admin) -**Response Time:** 109ms - -## References - -- Issue description: [issues/447.md](../../issues/447.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #447 AC2: Concept organisations excluded from unauthenticated search | PASS | 109ms | -| #447 AC3: Concept organisations excluded from authenticated search | PASS | 104ms | - diff --git a/test-results/api/issues/450.md b/test-results/api/issues/450.md deleted file mode 100644 index 713e1187..00000000 --- a/test-results/api/issues/450.md +++ /dev/null @@ -1,20 +0,0 @@ -# #450 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #450 AC3: No legacy publish-status flags on organisations -**Response Time:** 85ms - -## References - -- Issue description: [issues/450.md](../../issues/450.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #450 AC3: No publish-related status flags on organisations | PASS | 85ms | - diff --git a/test-results/api/issues/451.md b/test-results/api/issues/451.md deleted file mode 100644 index 482dd485..00000000 --- a/test-results/api/issues/451.md +++ /dev/null @@ -1,21 +0,0 @@ -# #451 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #451 AC1: Koppeling standaardversie resolves to display names -**Response Time:** 82ms - -## References - -- Issue description: [issues/451.md](../../issues/451.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #451 AC1: Koppeling endpoint returns 200 | PASS | 82ms | -| #451 AC1: Koppeling standaardversie fields do not contain raw UUIDs | PASS | 82ms | - diff --git a/test-results/api/issues/452.md b/test-results/api/issues/452.md deleted file mode 100644 index a4033f38..00000000 --- a/test-results/api/issues/452.md +++ /dev/null @@ -1,21 +0,0 @@ -# #452 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #452 AC1: Applicatie overview returns correct koppelingen count -**Response Time:** 118ms - -## References - -- Issue description: [issues/452.md](../../issues/452.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #452 AC1: Applicatie endpoint returns 200 | PASS | 118ms | -| #452 AC1: Applicatie has koppelingen array via _extend | PASS | 118ms | - diff --git a/test-results/api/issues/453.md b/test-results/api/issues/453.md deleted file mode 100644 index 0461ac7f..00000000 --- a/test-results/api/issues/453.md +++ /dev/null @@ -1,22 +0,0 @@ -# #453 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #453 AC1: Search with type=koppeling returns scoped facet counts -**Response Time:** 114ms - -## References - -- Issue description: [issues/453.md](../../issues/453.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #453 AC1: Search with type filter returns 200 | PASS | 114ms | -| #453 AC1: Response includes facets | PASS | 114ms | -| #453 AC1: Facet counts are scoped to filtered results | PASS | 114ms | - diff --git a/test-results/api/issues/454.md b/test-results/api/issues/454.md deleted file mode 100644 index cc1895a2..00000000 --- a/test-results/api/issues/454.md +++ /dev/null @@ -1,22 +0,0 @@ -# #454 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #454 AC1: Koppeling search is not scoped by organisation -**Response Time:** 88ms - -## References - -- Issue description: [issues/454.md](../../issues/454.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #454 AC1: Public koppeling endpoint returns 200 | PASS | 88ms | -| #454 AC1: Koppelingen are visible cross-org without auth | PASS | 88ms | -| #454 AC1: Koppelingen come from multiple organisations | PASS | 88ms | - diff --git a/test-results/api/issues/455.md b/test-results/api/issues/455.md deleted file mode 100644 index d1543fe9..00000000 --- a/test-results/api/issues/455.md +++ /dev/null @@ -1,23 +0,0 @@ -# #455 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #455 AC2: Public API returns application contactpersonen -**Response Time:** 227ms - -## References - -- Issue description: [issues/455.md](../../issues/455.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #455 AC1: Public koppelingen endpoint returns 200 | PASS | 82ms | -| #455 AC1: Public koppelingen returns results | PASS | 82ms | -| #455 AC2: Public contactpersonen endpoint returns 200 | PASS | 227ms | -| #455 AC2: Public contactpersonen returns results | PASS | 227ms | - diff --git a/test-results/api/issues/57.md b/test-results/api/issues/57.md deleted file mode 100644 index 04a9fdf9..00000000 --- a/test-results/api/issues/57.md +++ /dev/null @@ -1,20 +0,0 @@ -# #57 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #57 AC1: Samenwerking user can access API -**Response Time:** 81ms - -## References - -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #57 AC1: Samenwerking user can access /api/me | PASS | 81ms | -| #57 AC2: No server error for samenwerking user | PASS | 81ms | - diff --git a/test-results/api/issues/6.md b/test-results/api/issues/6.md deleted file mode 100644 index 5e2d7583..00000000 --- a/test-results/api/issues/6.md +++ /dev/null @@ -1,25 +0,0 @@ -# #6 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #6 AC9: Standards at version level -**Response Time:** 795ms - -## References - -- Issue description: [issues/6.md](../../issues/6.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #6 AC2: Can set compliance status (standaardversies) | PASS | 691ms | -| #6 AC5: Standards visible on detail | PASS | 795ms | -| #6 AC8: Standards field is array or null | PASS | 795ms | -| #6 AC1: Applications have standaardversies field | PASS | 91ms | -| #6 AC5: Public applicatie accessible | PASS | 84ms | -| #6 AC9: Single application detail accessible | PASS | 91ms | - diff --git a/test-results/api/issues/65.md b/test-results/api/issues/65.md deleted file mode 100644 index bb4d5245..00000000 --- a/test-results/api/issues/65.md +++ /dev/null @@ -1,30 +0,0 @@ -# #65 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #65 Username-email sync check -**Response Time:** 213ms - -## References - -- Issue description: [issues/65.md](../../issues/65.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #65 AC2: Contact person created with required fields | PASS | 93ms | -| #65 AC8: Editing updates data | PASS | 184ms | -| #65 AC8: Edit reflected in GET | PASS | 85ms | -| #65 AC11: User can access contact persons | PASS | 84ms | -| #65 AC3: Contact persons have organisatie reference | PASS | 84ms | -| #65 AC4: Contact persons have rollen field | PASS | 84ms | -| #65 AC5: Contact persons have e-mailadres field | PASS | 84ms | -| #65 AC6: Contact persons have isAanspreekpunt field | PASS | 84ms | -| #65 Email edit does not produce 400 error — contactpersoon endpoint returns 200 | PASS | 94ms | -| #65 Email field accepts valid email format — e-mailadres is string or null | PASS | 94ms | -| #65 Username equals email — contact persons have consistent email fields | PASS | 213ms | - diff --git a/test-results/api/issues/73.md b/test-results/api/issues/73.md deleted file mode 100644 index 3e32b2f1..00000000 --- a/test-results/api/issues/73.md +++ /dev/null @@ -1,24 +0,0 @@ -# #73 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #73 AC3: Contact list as different user shows different contacts -**Response Time:** 190ms - -## References - -- Issue description: [issues/73.md](../../issues/73.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #73 AC1: Second contact person created (status 201) | PASS | 190ms | -| #73 AC12: Creating second contact succeeds | PASS | 190ms | -| #73 AC8: Contact names are readable (not UUID) | PASS | 85ms | -| #73 AC3: Maria can list contacts | PASS | 102ms | -| #73 AC4: Multiple contacts can exist | PASS | 102ms | - diff --git a/test-results/api/issues/85.md b/test-results/api/issues/85.md deleted file mode 100644 index 00bed3fd..00000000 --- a/test-results/api/issues/85.md +++ /dev/null @@ -1,27 +0,0 @@ -# #85 — API Test Results - -**Status:** PASS -**Date:** 2026-03-06 14:39 -**Environment:** local -**Request:** #85 AC6: Public contactpersonen NOT accessible (RBAC) -**Response Time:** 108ms - -## References - -- Issue description: [issues/85.md](../../issues/85.md) -- Acceptance criteria: [issues.md](../../issues.md) -- Supplementary info: [aanvullende-informatie.md](../../aanvullende-informatie.md) - -## Test Results - -| Test | Status | Details | -|------|--------|--------| -| #85 AC1: Public API accessible and returns data | PASS | 108ms | -| #85 AC2: Response contains results array | PASS | 108ms | -| #85 AC6: API supports pagination params | PASS | 108ms | -| #85 AC3: API returns organisaties | PASS | 84ms | -| #85 AC2: Response includes pagination fields | PASS | 79ms | -| #85 AC4: Public diensten endpoint returns data | PASS | 90ms | -| #85 AC5: Koppelingen endpoint responds | PASS | 86ms | -| #85 AC6: Contactpersonen endpoint responds | PASS | 76ms | - diff --git a/test-results/api/results-raw.txt b/test-results/api/results-raw.txt deleted file mode 100644 index 74b040cb..00000000 --- a/test-results/api/results-raw.txt +++ /dev/null @@ -1,2049 +0,0 @@ -newman - -GEMMA Softwarecatalogus API Tests - -❏ 00 - Setup -↳ Health Check - Nextcloud Status - GET http://localhost:8080/status.php [200 OK, 1.09kB, 53ms] - ✓ Nextcloud is reachable - ┌ - │ 'Nextcloud version: 32.0.5' - └ - ✓ Returns valid JSON with version info - -↳ Create Group: aanbod-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/groups [400 Bad request, 1.53kB, 562ms] - ✓ Group 'aanbod-beheerder' created or exists - -↳ Create Group: gebruik-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/groups [400 Bad request, 2.1kB, 904ms] - ✓ Group 'gebruik-beheerder' created or exists - -↳ Create Group: functioneel-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/groups [400 Bad request, 973B, 51ms] - ✓ Group 'functioneel-beheerder' created or exists - -↳ Create Group: software-catalog-users - POST http://localhost:8080/ocs/v2.php/cloud/groups [400 Bad request, 791B, 47ms] - ✓ Group 'software-catalog-users' created or exists - -↳ Create Group: software-catalog-admins - POST http://localhost:8080/ocs/v2.php/cloud/groups [400 Bad request, 791B, 46ms] - ✓ Group 'software-catalog-admins' created or exists - -↳ Create User: jan.pietersen@test.nl - POST http://localhost:8080/ocs/v2.php/cloud/users [400 Bad request, 798B, 49ms] - ✓ User 'jan.pietersen@test.nl' created or exists - -↳ Create User: jan.vandeberg@testleverancier.nl - POST http://localhost:8080/ocs/v2.php/cloud/users [400 Bad request, 798B, 49ms] - ✓ User 'jan.vandeberg@testleverancier.nl' created or exists - -↳ Create User: maria.vanderberg@test.nl - POST http://localhost:8080/ocs/v2.php/cloud/users [400 Bad request, 798B, 49ms] - ✓ User 'maria.vanderberg@test.nl' created or exists - -↳ Create User: mark.jansen@test.nl - POST http://localhost:8080/ocs/v2.php/cloud/users [400 Bad request, 798B, 46ms] - ✓ User 'mark.jansen@test.nl' created or exists - -↳ Create User: linda.bakker@test.nl - POST http://localhost:8080/ocs/v2.php/cloud/users [400 Bad request, 798B, 48ms] - ✓ User 'linda.bakker@test.nl' created or exists - -↳ Create User: peter.vandijk@test.nl - POST http://localhost:8080/ocs/v2.php/cloud/users [400 Bad request, 798B, 46ms] - ✓ User 'peter.vandijk@test.nl' created or exists - -↳ Create User: sarah.devries@test.nl - POST http://localhost:8080/ocs/v2.php/cloud/users [400 Bad request, 798B, 46ms] - ✓ User 'sarah.devries@test.nl' created or exists - -↳ Add jan.pietersen to aanbod-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/users/jan.pietersen%40test.nl/groups [200 OK, 835B, 54ms] - ✓ User added to group or already member - -↳ Add jan.pietersen to software-catalog-users - POST http://localhost:8080/ocs/v2.php/cloud/users/jan.pietersen%40test.nl/groups [200 OK, 834B, 47ms] - ✓ User added to group or already member - -↳ Add jan.vandeberg to aanbod-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/users/jan.vandeberg%40testleverancier.nl/groups [200 OK, 834B, 49ms] - ✓ User added to group or already member - -↳ Add jan.vandeberg to software-catalog-users - POST http://localhost:8080/ocs/v2.php/cloud/users/jan.vandeberg%40testleverancier.nl/groups [200 OK, 834B, 48ms] - ✓ User added to group or already member - -↳ Add maria.vanderberg to gebruik-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/users/maria.vanderberg%40test.nl/groups [200 OK, 834B, 50ms] - ✓ User added to group or already member - -↳ Add maria.vanderberg to software-catalog-users - POST http://localhost:8080/ocs/v2.php/cloud/users/maria.vanderberg%40test.nl/groups [200 OK, 834B, 54ms] - ✓ User added to group or already member - -↳ Add mark.jansen to gebruik-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/users/mark.jansen%40test.nl/groups [200 OK, 834B, 53ms] - ✓ User added to group or already member - -↳ Add mark.jansen to software-catalog-users - POST http://localhost:8080/ocs/v2.php/cloud/users/mark.jansen%40test.nl/groups [200 OK, 834B, 55ms] - ✓ User added to group or already member - -↳ Add linda.bakker to gebruik-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/users/linda.bakker%40test.nl/groups [200 OK, 834B, 52ms] - ✓ User added to group or already member - -↳ Add linda.bakker to software-catalog-users - POST http://localhost:8080/ocs/v2.php/cloud/users/linda.bakker%40test.nl/groups [200 OK, 834B, 66ms] - ✓ User added to group or already member - -↳ Add peter.vandijk to functioneel-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/users/peter.vandijk%40test.nl/groups [200 OK, 834B, 57ms] - ✓ User added to group or already member - -↳ Add peter.vandijk to gebruik-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/users/peter.vandijk%40test.nl/groups [200 OK, 834B, 55ms] - ✓ User added to group or already member - -↳ Add peter.vandijk to aanbod-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/users/peter.vandijk%40test.nl/groups [200 OK, 834B, 52ms] - ✓ User added to group or already member - -↳ Add peter.vandijk to software-catalog-admins - POST http://localhost:8080/ocs/v2.php/cloud/users/peter.vandijk%40test.nl/groups [200 OK, 834B, 54ms] - ✓ User added to group or already member - -↳ Add peter.vandijk to software-catalog-users - POST http://localhost:8080/ocs/v2.php/cloud/users/peter.vandijk%40test.nl/groups [200 OK, 834B, 49ms] - ✓ User added to group or already member - -↳ Add sarah.devries to gebruik-beheerder - POST http://localhost:8080/ocs/v2.php/cloud/users/sarah.devries%40test.nl/groups [200 OK, 834B, 50ms] - ✓ User added to group or already member - -↳ Add sarah.devries to software-catalog-users - POST http://localhost:8080/ocs/v2.php/cloud/users/sarah.devries%40test.nl/groups [200 OK, 834B, 51ms] - ✓ User added to group or already member - -↳ Create Org: Test Leverancier BV - POST http://localhost:8080/index.php/apps/openregister/api/organisations [201 Created, 2.24kB, 61ms] - ✓ Org created or exists - -↳ Create Org: Test Gemeente - POST http://localhost:8080/index.php/apps/openregister/api/organisations [201 Created, 2.23kB, 64ms] - ✓ Org created or exists - -↳ Create Org: Test Samenwerking - POST http://localhost:8080/index.php/apps/openregister/api/organisations [201 Created, 2.24kB, 66ms] - ✓ Org created or exists - -↳ Create Org: Test Leverancier 2 - POST http://localhost:8080/index.php/apps/openregister/api/organisations [201 Created, 2.24kB, 68ms] - ✓ Org created or exists - -↳ Lookup All NC Org UUIDs - GET http://localhost:8080/index.php/apps/openregister/api/organisations?_limit=500 [200 OK, 1.7kB, 55ms] - ✓ Can list organisations - ┌ - │ 'Lever NC: cb2c9944-3dce-434a-aac0-e045585ea7e6' - │ 'Gemeente NC: 9db4ca68-fc03-48f7-84bc-03e0f23f1e26' - │ 'Samenwerking NC: 470257f2-45a2-4dcc-bd7c-4eeba713e5b6 - │ ' - │ 'Lever2 NC: 8110707e-b24b-4c11-aba2-4629a74a4acf' - └ - -↳ Create Register Org: Test Leverancier BV - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie [201 Created, 1.85kB, 116ms] - ✓ Register org created or exists - ┌ - │ 'Test Leverancier BV REG UUID: 4445ff49-af8d-454c-9fd5 - │ -d9f87ebca45a' - └ - -↳ Create Register Org: Test Gemeente - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie [201 Created, 1.83kB, 113ms] - ✓ Register org created or exists - ┌ - │ 'Test Gemeente REG UUID: 9ffbe598-968d-422e-a028-ec0e1 - │ 1aa74ed' - └ - -↳ Create Register Org: Test Samenwerking - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie [201 Created, 1.85kB, 112ms] - ✓ Register org created or exists - ┌ - │ 'Test Samenwerking REG UUID: 1acf7862-54b9-46ae-aa12-0 - │ d5652f13774' - └ - -↳ Create Register Org: Test Leverancier 2 - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie [201 Created, 1.85kB, 112ms] - ✓ Register org created or exists - ┌ - │ 'Test Leverancier 2 REG UUID: 9e74a994-f988-45a2-9989- - │ 6800c049f9a4' - └ - -↳ Lookup All Register Org UUIDs - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=500 [200 OK, 2.13kB, 57ms] - ✓ Can list register organisations - ┌ - │ `Using "btoa" is deprecated. Use "require('btoa')" ins - │ tead.` - └ - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?naam=Test%20Leverancier%20BV&_limit=1 [200 OK, 1.22kB, 56ms] - ┌ - │ 'Test Leverancier BV UUID: 109bc300-2e85-40c2-8920-db4 - │ 893850283' - └ - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?naam=Test%20Gemeente&_limit=1 [200 OK, 1.21kB, 57ms] - ┌ - │ 'Test Gemeente UUID: 0b5fda0a-b221-4041-afad-d93520401 - │ ec9' - └ - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?naam=Test%20Samenwerking&_limit=1 [200 OK, 1.29kB, 57ms] - ┌ - │ 'Test Samenwerking UUID: d4bd5eb6-0a48-45d9-bb04-7dacc - │ 5cbfab5' - └ - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?naam=Test%20Leverancier%202&_limit=1 [200 OK, 1.18kB, 55ms] - ┌ - │ 'Test Leverancier 2 UUID: f2e7ab73-3d58-4b24-a355-3305 - │ 08158511' - └ - -↳ Join jan.pietersen to Test Leverancier BV - POST http://localhost:8080/index.php/apps/openregister/api/organisations/cb2c9944-3dce-434a-aac0-e045585ea7e6/join [400 Bad request, 736B, 49ms] - ✓ jan.pietersen@test.nl joined Test Leverancier BV - -↳ Set Active: jan.pietersen -> Test Leverancier BV - POST http://localhost:8080/index.php/apps/openregister/api/organisations/cb2c9944-3dce-434a-aac0-e045585ea7e6/set-active [400 Bad request, 736B, 49ms] - ✓ jan.pietersen@test.nl active org set - -↳ Join jan.vandeberg to Test Leverancier 2 - POST http://localhost:8080/index.php/apps/openregister/api/organisations/8110707e-b24b-4c11-aba2-4629a74a4acf/join [400 Bad request, 736B, 49ms] - ✓ jan.vandeberg@testleverancier.nl joined Test Leverancier 2 - -↳ Set Active: jan.vandeberg -> Test Leverancier 2 - POST http://localhost:8080/index.php/apps/openregister/api/organisations/8110707e-b24b-4c11-aba2-4629a74a4acf/set-active [400 Bad request, 736B, 49ms] - ✓ jan.vandeberg@testleverancier.nl active org set - -↳ Join maria.vanderberg to Test Gemeente - POST http://localhost:8080/index.php/apps/openregister/api/organisations/9db4ca68-fc03-48f7-84bc-03e0f23f1e26/join [400 Bad request, 736B, 49ms] - ✓ maria.vanderberg@test.nl joined Test Gemeente - -↳ Set Active: maria.vanderberg -> Test Gemeente - POST http://localhost:8080/index.php/apps/openregister/api/organisations/9db4ca68-fc03-48f7-84bc-03e0f23f1e26/set-active [400 Bad request, 736B, 53ms] - ✓ maria.vanderberg@test.nl active org set - -↳ Join mark.jansen to Test Gemeente - POST http://localhost:8080/index.php/apps/openregister/api/organisations/9db4ca68-fc03-48f7-84bc-03e0f23f1e26/join [400 Bad request, 736B, 51ms] - ✓ mark.jansen@test.nl joined Test Gemeente - -↳ Set Active: mark.jansen -> Test Gemeente - POST http://localhost:8080/index.php/apps/openregister/api/organisations/9db4ca68-fc03-48f7-84bc-03e0f23f1e26/set-active [400 Bad request, 736B, 49ms] - ✓ mark.jansen@test.nl active org set - -↳ Join linda.bakker to Test Samenwerking - POST http://localhost:8080/index.php/apps/openregister/api/organisations/470257f2-45a2-4dcc-bd7c-4eeba713e5b6/join [400 Bad request, 736B, 62ms] - ✓ linda.bakker@test.nl joined Test Samenwerking - -↳ Set Active: linda.bakker -> Test Samenwerking - POST http://localhost:8080/index.php/apps/openregister/api/organisations/470257f2-45a2-4dcc-bd7c-4eeba713e5b6/set-active [400 Bad request, 736B, 58ms] - ✓ linda.bakker@test.nl active org set - -↳ Create Contact: Jan Pietersen - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon [201 Created, 1.85kB, 130ms] - ✓ Contact created or exists - ┌ - │ 'Contact Jan Pietersen: 0eb6e965-f195-422a-b19f-7bc06b - │ 39973d' - └ - -↳ Create Contact: Maria van der Berg - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon [201 Created, 1.87kB, 113ms] - ✓ Contact created or exists - ┌ - │ 'Contact Maria Berg: 81057de0-59e6-4108-9c86-c3da1c28e - │ dc8' - └ - -↳ Create Contact: Mark Jansen - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon [201 Created, 1.85kB, 130ms] - ✓ Contact created or exists - ┌ - │ 'Contact Mark Jansen: 4f39e130-5ea0-4401-8287-4f92619d - │ 85dc' - └ - -↳ Create Contact: Linda Bakker - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon [201 Created, 1.86kB, 117ms] - ✓ Contact created or exists - ┌ - │ 'Contact Linda Bakker: c833d3ff-51e2-4710-a0cf-83a7fd0 - │ e1c65' - └ - -↳ Lookup Test Contact UUIDs - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=50 [200 OK, 2.06kB, 67ms] - ✓ Can list contacts - ┌ - │ 'jan_contact_uuid: 0eb6e965-f195-422a-b19f-7bc06b39973 - │ d' - │ 'maria_contact_uuid: 81057de0-59e6-4108-9c86-c3da1c28e - │ dc8' - └ - -↳ Create Test Applicatie Leverancier - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module [201 Created, 2.37kB, 153ms] - ✓ Applicatie created - -↳ Create Test Applicatie Leverancier 2 - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module [201 Created, 2.14kB, 150ms] - ✓ Applicatie 2 created - -↳ Create Test Dienst Leverancier - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst [201 Created, 1.87kB, 149ms] - ✓ Dienst created - -↳ Create Test Applicatie Gemeente - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module [201 Created, 2.1kB, 142ms] - ✓ Gemeente applicatie created - -↳ Lookup Test Applicatie UUIDs - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=50&_search=Test Applicatie [200 OK, 2.2kB, 61ms] - ✓ Can list applicaties - ┌ - │ 'lever_app_uuid: 5c8609c8-6c82-4918-afa9-7151e9ab1f9d' - │ 'lever2_app_uuid: 3ccd9e93-6325-4205-980a-11dd1a3014b2 - │ ' - │ 'gemeente_app_uuid: 35b6f707-9e97-40c4-8ac5-2fa98f7d85 - │ 87' - └ - -↳ Seed Profile: jan.pietersen - PUT http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 852B, 157ms] - ✓ Profile seeded for jan.pietersen@test.nl - -↳ Seed Profile: jan.vandeberg - PUT http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 852B, 149ms] - ✓ Profile seeded for jan.vandeberg@testleverancier.nl - -↳ Seed Profile: maria.vanderberg - PUT http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 852B, 165ms] - ✓ Profile seeded for maria.vanderberg@test.nl - -↳ Seed Profile: mark.jansen - PUT http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 852B, 151ms] - ✓ Profile seeded for mark.jansen@test.nl - -↳ Seed Profile: linda.bakker - PUT http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 852B, 158ms] - ✓ Profile seeded for linda.bakker@test.nl - -↳ Seed Profile: peter.vandijk - PUT http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 852B, 159ms] - ✓ Profile seeded for peter.vandijk@test.nl - -↳ Seed Profile: sarah.devries - PUT http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 852B, 160ms] - ✓ Profile seeded for sarah.devries@test.nl - -❏ 01 - Public API & Search / #85 - Public API accessible -↳ #85 AC1: Public API returns data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 58ms] - ✓ #85 AC1: Public API accessible and returns data - ✓ #85 AC2: Response contains results array - ✓ #85 AC6: API supports pagination params - -↳ #85 AC3: API returns organisaties - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=5 [200 OK, 1.68kB, 60ms] - ✓ #85 AC3: API returns organisaties - -❏ 01 - Public API & Search / #144 - Search functionality -↳ #144 AC1: Search returns results - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications?_search=test&_limit=10 [404 Not Found, 765B, 49ms] - 1. #144 AC1: Search returns results - ✓ #144 AC5: Results contain beschrijvingKort - -↳ #144 AC8: Organisation names readable (not UUID) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=10 [200 OK, 2kB, 58ms] - ✓ #144 AC8: Organisation names are readable text (not UUID) - -❏ 01 - Public API & Search / #315 - Leverancier filter -↳ #315 AC1: Leverancier filter only suppliers - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?type=Leverancier&_limit=50 [200 OK, 1.63kB, 61ms] - ✓ #315 AC1: Filter returns only leveranciers - -↳ #315 AC4: Applicatie shows correct supplier - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/5c8609c8-6c82-4918-afa9-7151e9ab1f9d [200 OK, 1.25kB, 68ms] - ✓ #315 AC4: Applicatie has geregistreerdDoor field - -❏ 01 - Public API & Search / #346 - Pagination -↳ #346 AC1-2: Pagination returns different results per page - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=2&_page=1 [200 OK, 1.59kB, 61ms] - ✓ #346: Page 1 returns results - -↳ #346 AC1-2: Page 2 has different results - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=2&_page=2 [200 OK, 1.56kB, 61ms] - ✓ #346 AC1: Page 2 shows different results than page 1 - -❏ 01 - Public API & Search / #440 - Organisatietype filter -↳ #440: Filter by Gemeente - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?type=Gemeente&_limit=5 [200 OK, 1.53kB, 60ms] - ✓ #440: Filtering by Gemeente returns correct results - -↳ #440: Filter by Leverancier - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?type=Leverancier&_limit=5 [200 OK, 1.58kB, 58ms] - ✓ #440: Filtering by Leverancier returns correct results - -↳ #440: Filter by Samenwerking - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?type=Samenwerking&_limit=5 [200 OK, 1.44kB, 64ms] - ✓ #440: Filtering by Samenwerking returns correct results - -❏ 01 - Public API & Search / #345 - Diensten in search -↳ #345 AC5: Filter by dienst returns only diensten - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=10 [200 OK, 1.45kB, 63ms] - ✓ #345 AC5: Diensten endpoint returns results - -❏ 01 - Public API & Search / #343 - Type koppeling filter -↳ #343 AC3-4: Koppelingen endpoint returns data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=10 [200 OK, 996B, 200ms] - ✓ #343: Koppelingen endpoint returns results - ✓ #343 AC5: Koppelingen have koppelingType attribute - -❏ 01 - Public API & Search / #344 - Reference component filter -↳ #344 AC4: Unauthenticated search works - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 78ms] - ✓ #344 AC3: Works for unauthenticated users - -❏ 01 - Public API & Search / #85 - Public API (extended) -↳ #85 AC2: API returns pagination metadata - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 68ms] - ✓ #85 AC2: Response includes pagination fields - -↳ #85 AC4: Public diensten endpoint accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=5 [200 OK, 1.45kB, 62ms] - ✓ #85 AC4: Public diensten endpoint returns data - -↳ #85 AC5: Public koppelingen NOT accessible (RBAC) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=5 [200 OK, 996B, 60ms] - ✓ #85 AC5: Koppelingen endpoint responds - -↳ #85 AC6: Public contactpersonen NOT accessible (RBAC) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=5 [200 OK, 1.71kB, 58ms] - ✓ #85 AC6: Contactpersonen endpoint responds - -❏ 01 - Public API & Search / #144 - Search (extended) -↳ #144 AC2: Search by partial name - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=test&_limit=10 [200 OK, 2.21kB, 59ms] - ✓ #144 AC2: Partial name search returns results - -↳ #144 AC3: Search with _facets returns facet data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5&_facets=geregistreerdDoor,type [200 OK, 2.11kB, 68ms] - ✓ #144 AC3: Facet data returned with results - ✓ #144 AC4: Facets contain expected fields - -↳ #144 AC5: Search with sort parameter - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10&_sort=naam [200 OK, 2.2kB, 59ms] - ✓ #144 AC5: Sorted results returned - ✓ #280 AC1: Sort parameter accepted - ✓ #340 AC1: Default sort produces results - -↳ #144 AC6: Empty search returns all results - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 59ms] - ✓ #144 AC6: No search filter returns results - -↳ #144 AC7: Search reduces result count - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=zaak&_limit=5 [200 OK, 1kB, 61ms] - ✓ #144 AC7: Filtered search has fewer results than unfiltered - -❏ 01 - Public API & Search / #346 - Pagination (extended) -↳ #346 AC3: Page offset works correctly - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5&_page=3 [200 OK, 1kB, 58ms] - ✓ #346 AC3: Page 3 accessible - ✓ #346 AC4: Total stays consistent across pages - -❏ 01 - Public API & Search / #278 - Filter label consistency -↳ #278 AC1: Filter values are readable strings - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_facets=geregistreerdDoor [200 OK, 1.65kB, 66ms] - ✓ #278 AC1: Facets returned with results - ✓ #278 AC2: geregistreerdDoor facet has buckets - -❏ 01 - Public API & Search / #349 - Standards filter readable -↳ #349 AC1: Standards facet returns readable names - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_facets=standaardversies [200 OK, 1.55kB, 67ms] - ✓ #349 AC1: Standards facet accessible - ✓ #349 AC2: Standards facet values not UUIDs - -❏ 01 - Public API & Search / #333 - UUID elimination in facets -↳ #333 AC1: Organisation facet has no UUIDs - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_facets=organisatie [200 OK, 1.55kB, 65ms] - ✓ #333 AC1: Organisation facet values are readable - -↳ #333 AC2: Type facet has no UUIDs - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_facets=type [200 OK, 1.56kB, 64ms] - ✓ #333 AC2: Type facet values are readable - -❏ 01 - Public API & Search / #398 - Leverancier filter readable names -↳ #398 AC1: Leverancier facet shows org names not UUIDs - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_facets=geregistreerdDoor [200 OK, 1.65kB, 65ms] - ✓ #398 AC1: geregistreerdDoor facet accessible - ✓ #398 AC2: Facet includes Leverancier bucket - -❏ 01 - Public API & Search / #144 - Search cards (extended) -↳ #144 AC9: Authenticated search has richer data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=zaak&_limit=5 [200 OK, 1kB, 61ms] - ✓ #144 AC9: Authenticated search returns results with org context - -❏ 01 - Public API & Search / #280 - Sorting (extended) -↳ #280 AC2: Sort with pagination — page 1 vs page 2 consistent - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_sort=naam&_limit=5&_page=1 [200 OK, 1.92kB, 58ms] - ✓ #280 AC2: Sorted page 1 accessible - -↳ #280 AC3: Page 2 continues sort order - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_sort=naam&_limit=5&_page=2 [200 OK, 1.7kB, 62ms] - ✓ #280 AC3: Page 2 first item follows page 1 last item - -❏ 01 - Public API & Search / #340 - Sort after search -↳ #340 AC2: Sort applied after search filter - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=e&_sort=naam&_limit=10 [200 OK, 2.21kB, 60ms] - ✓ #340 AC2: Search + sort combined works - -❏ 01 - Public API & Search / #333 - UUID resolution specifics -↳ #333 AC3: Referentiecomponent facet no UUIDs - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_facets=referentieComponenten [200 OK, 1.56kB, 69ms] - ✓ #333 AC3: referentieComponenten facet accessible - ✓ #333 AC4: referentieComponenten buckets have readable labels - -❏ 01 - Public API & Search / #344 - Ref component filters (extended) -↳ #344 AC2: Filter by specific reference component - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5&_facets=referentieComponenten [200 OK, 2.04kB, 67ms] - ✓ #344 AC2: Reference component facet returns buckets - 2. #344 AC3: Multiple reference components available - -❏ 01 - Public API & Search / #345 - Diensten filter (extended) -↳ #345 AC1: Diensttype facet populated with values - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=1&_facets=diensttype [200 OK, 1.43kB, 65ms] - ✓ #345 AC2: Diensttype facet structure correct - ✓ #345 AC3: Diensten schema returns only diensten - -❏ 01 - Public API & Search / #346 - Pagination combos -↳ #346 AC5: Pagination with filter applied - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?geregistreerdDoor=Leverancier&_limit=5&_page=1 [200 OK, 1.66kB, 57ms] - ✓ #346 AC5: Pagination works with filter - ✓ #346 AC6: Pagination with sort maintains consistency - -❏ 01 - Public API & Search / #336 - Identificatie column -↳ #336 AC1: Objects have consistent identification - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.19kB, 60ms] - ✓ #336 AC1: All applicaties have @self.id - -❏ 01 - Public API & Search / #398 - Leverancier filter (extended) -↳ #398 AC3: Facet resolves names inline (no extra calls) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_facets=geregistreerdDoor [200 OK, 1.65kB, 68ms] - ✓ #398 AC3: Facet buckets have label field - ✓ #398 AC4: Facet values are human-readable supplier names - -❏ 01 - Public API & Search / #302 - Fields populated on load [CLOSED - regression] -↳ #302 AC1: Application fields populated after load - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.19kB, 63ms] - ✓ #302 AC1: Applications have populated fields - -❏ 01 - Public API & Search / #358 - No concept in search [CLOSED - regression] -↳ #358 AC1: Public search does not return concept-status items - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=50 [200 OK, 2.19kB, 61ms] - ✓ #358 AC1: No concept-status items in public results - -❏ 01 - Public API & Search / #363 - Terminology consistency [CLOSED - regression] -↳ #363 AC1: API responses use consistent terminology - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 64ms] - ✓ #363 AC1: No standalone catalogus in API response - ✓ #363 AC2: No space-separated software catalogus - -❏ 01 - Public API & Search / #374 - Standards readable names [CLOSED - regression] -↳ #374 AC1: Standards references use readable format - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=50&_fields=naam,standaardVersies,referentieComponenten [200 OK, 2.15kB, 67ms] - ✓ #374 AC1: Standards references accessible in readable format - -❏ 01 - Public API & Search -↳ #144 Leverancier count: migration check - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?organisatieType=Leverancier&_limit=1 [200 OK, 1.02kB, 63ms] - ✓ #144 Leverancier count matches migration source — at least 300 leveranciers exist - ✓ #144 Leverancier count is reasonable — not more than 500 - -↳ #349 Standaardversies facet: no UUIDs - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_facets=standaardversies [200 OK, 1.55kB, 71ms] - ✓ #349 Standaardversies facet returns readable names — no UUID labels in facet buckets - -↳ #398 Leveranciers facet: UUID check (re-opened) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_facets=geregistreerdDoor [200 OK, 1.65kB, 71ms] - ✓ #398 Leveranciers filter shows readable names — no UUID labels in geregistreerdDoor facet - -↳ #443 AC3: Dienst API returns diensttypen as array - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=5 [200 OK, 1.45kB, 66ms] - ✓ #443 AC3: Dienst API returns diensttypen as array - -↳ #447 AC2: Search excludes concept organisations (unauthenticated) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_search=Theekop [200 OK, 1kB, 63ms] - ✓ #447 AC2: Concept organisations excluded from unauthenticated search - -↳ #447 AC3: Search excludes concept organisations (authenticated, non-admin) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_search=Theekop [200 OK, 1kB, 63ms] - ✓ #447 AC3: Concept organisations excluded from authenticated search - -↳ #453 AC1: Search with type=koppeling returns scoped facet counts - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=test&type=koppeling&_facets=type,geregistreerdDoor&_limit=5 [200 OK, 1.15kB, 71ms] - ✓ #453 AC1: Search with type filter returns 200 - ✓ #453 AC1: Response includes facets - ┌ - │ 'Facet "@self" sum: 0, total results: 0' - └ - ✓ #453 AC1: Facet counts are scoped to filtered results - -❏ 02 - RBAC & Organization Scoping / #105 - Aanbod-beheerder sees own org only -↳ #105 AC1: Jan sees only own org applicaties - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=50 [200 OK, 2.19kB, 60ms] - ✓ #105 AC1: Aanbod-beheerder sees applicaties - ✓ #105 AC5: Results include user's org and public Leverancier modules - -↳ #105 AC2: Admin sees MORE applicaties than jan - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 64ms] - ✓ #105 AC2: Admin sees applicaties - -❏ 02 - RBAC & Organization Scoping / #300 - Application count matches org -↳ #300 AC1-4: Jan's app count is correct - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=50 [200 OK, 2.19kB, 62ms] - ✓ #300 AC4: Returned objects are valid and accessible - -❏ 02 - RBAC & Organization Scoping / #307 - Services scoped to org -↳ #307 AC1-2: Jan's diensten scoped to own org - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=50 [200 OK, 1.45kB, 63ms] - ✓ #307 AC1: Diensten are accessible to user - -❏ 02 - RBAC & Organization Scoping / #394 - Contact person visibility -↳ #394 AC1: Public applicatie list accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=3 [200 OK, 1.73kB, 66ms] - ✓ #394 AC1: Public applicatie list accessible - ✓ #394 AC2: Public results contain applicatie data - -↳ #394 AC6: Authenticated sees contacts - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=10 [200 OK, 2kB, 67ms] - ✓ #394 AC6: Authenticated user can see contacts - -❏ 02 - RBAC & Organization Scoping / #414 - Deelnemers read access -↳ #414: Deelnemers endpoint accessible - GET http://localhost:8080/index.php/apps/softwarecatalog/api/aangeboden-gebruik/deelnemers [200 OK, 880B, 184ms] - ✓ #414: Deelnemers endpoint accessible - -❏ 02 - RBAC & Organization Scoping / #315 - Leverancier RBAC scoping (extended) -↳ #315 AC2: Public sees only leverancier-registered apps - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.19kB, 61ms] - ✓ #315 AC2: Public applicaties accessible - -↳ #315 AC3: Admin sees ALL applicaties (not just supplier) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 60ms] - ✓ #315 AC3: Admin sees apps from all geregistreerdDoor types - -↳ #315 AC5: Admin sees more apps than public - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 59ms] - ✓ #315 AC5: Admin total exceeds or equals public total - -❏ 02 - RBAC & Organization Scoping / #225 - Organisation visibility -↳ #225 AC1: Public can see organisations - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=5 [200 OK, 1.68kB, 61ms] - ✓ #225 AC1: Public can access organisations - ✓ #225 AC2: Public organisations have limited fields - -↳ #225 AC3: Authenticated sees more org fields - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=5 [200 OK, 1.68kB, 60ms] - ✓ #225 AC3: Authenticated org listing accessible - -❏ 02 - RBAC & Organization Scoping / #440 - Organisation type filter (extended) -↳ #440 AC4: Filter by Community organisations - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?type=Community&_limit=10 [200 OK, 1kB, 60ms] - ✓ #440 AC4: Community filter returns only community orgs - -❏ 02 - RBAC & Organization Scoping / #315 - RBAC supplier display (deep) -↳ #315 AC6: Public apps show supplier in geregistreerdDoor - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.19kB, 72ms] - ✓ #315 AC6: Public apps have geregistreerdDoor field - 3. #315 AC7: geregistreerdDoor is readable string not UUID - -↳ #315 AC8: Single app detail shows correct supplier - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 67ms] - ✓ #315 AC8: App detail has supplier info - -❏ 02 - RBAC & Organization Scoping / #394 - Contactpersonen RBAC (extended) -↳ #394 AC2: Public cannot see contactpersoon details - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=5 [200 OK, 1.71kB, 65ms] - ✓ #394 AC2: Public contactpersonen access limited - -↳ #394 AC3: Admin sees all contactpersonen - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=5 [200 OK, 1.71kB, 59ms] - ✓ #394 AC3: Admin can list all contactpersonen - -↳ #394 AC4: User sees scoped contactpersonen - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=50 [200 OK, 2.06kB, 61ms] - ✓ #394 AC4: User contactpersonen list accessible - -❏ 02 - RBAC & Organization Scoping / #383 - Export row scoping [CLOSED - regression] -↳ #383 AC1: Export endpoint respects limit parameter - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 60ms] - ✓ #383 AC1: Export scoping — limit parameter restricts results - -❏ 02 - RBAC & Organization Scoping -↳ #455 AC1: Public API returns application koppelingen - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=10 [200 OK, 996B, 61ms] - ✓ #455 AC1: Public koppelingen endpoint returns 200 - 4. #455 AC1: Public koppelingen returns results - -↳ #455 AC2: Public API returns application contactpersonen - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=10 [200 OK, 2kB, 60ms] - ✓ #455 AC2: Public contactpersonen endpoint returns 200 - ┌ - │ 'Public contactpersonen returned 10 results' - └ - ✓ #455 AC2: Public contactpersonen returns results - -❏ 03 - Object CRUD / #6 - Standards management -↳ #6 AC2: PATCH applicatie with standaardversies - PATCH http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/5c8609c8-6c82-4918-afa9-7151e9ab1f9d [200 OK, 1.45kB, 198ms] - ✓ #6 AC2: Can set compliance status (standaardversies) - -↳ #6 AC6: Standards persist after saving - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/5c8609c8-6c82-4918-afa9-7151e9ab1f9d?_empty=true [200 OK, 1.45kB, 67ms] - ✓ #6 AC5: Standards visible on detail - ✓ #6 AC8: Standards field is array or null - -❏ 03 - Object CRUD / #65 - Contact person management -↳ #65 AC2: Create contact person with required fields - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon [500 Internal Server Error, 3.37kB, 94ms] - 5. #65 AC2: Contact person created with required fields - -↳ #65 Lookup: Find test contact UUID - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_search=Test Contact&_limit=5 [200 OK, 1.29kB, 57ms] - ┌ - │ 'Set test_contact_uuid to: a54b02f7-1ae6-4cb5-b0e1-fb1 - │ 16b897e0d' - └ - -↳ #65 AC8: Editing contact person updates data - PATCH http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon/a54b02f7-1ae6-4cb5-b0e1-fb116b897e0d [500 Internal Server Error, 3.37kB, 154ms] - 6. #65 AC8: Editing updates data - -↳ #65 AC8: Verify edit persisted - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon/a54b02f7-1ae6-4cb5-b0e1-fb116b897e0d [200 OK, 1.16kB, 67ms] - ✓ #65 AC8: Edit reflected in GET - -↳ #65 AC11: Only user's org contacts shown - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=50 [200 OK, 2.17kB, 57ms] - ✓ #65 AC11: User can access contact persons - -❏ 03 - Object CRUD / #73 - Multiple contact persons -↳ #73 AC1: Create second contact person - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon [500 Internal Server Error, 3.37kB, 92ms] - 7. #73 AC1: Second contact person created (status 201) - 8. #73 AC12: Creating second contact succeeds - -↳ #73 AC8: Contact readable names - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=10 [200 OK, 2kB, 56ms] - ✓ #73 AC8: Contact names are readable (not UUID) - -❏ 03 - Object CRUD / #365 - Edit contact person (no 400) -↳ #365 AC1: Edit contact saves without 400 - PATCH http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon/0eb6e965-f195-422a-b19f-7bc06b39973d [200 OK, 1.31kB, 254ms] - ✓ #365 AC1: Editing does NOT produce 400 error - -↳ #365 AC3: Changes persisted - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon/0eb6e965-f195-422a-b19f-7bc06b39973d [200 OK, 1.19kB, 68ms] - ✓ #365 AC3: Changes visible after saving - -❏ 03 - Object CRUD / #400 - Koppeling save -↳ #400 AC1-2: Create koppeling without error - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling [400 Bad request, 797B, 147ms] - ✓ #400 AC2: Koppeling saved without error - -↳ #400 Lookup: Find test koppeling UUID - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_search=Test Koppeling&_limit=5 [200 OK, 1.01kB, 59ms] - -↳ #400 AC3: Koppeling appears in overview - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_search=Test Koppeling&_limit=20 [200 OK, 1.01kB, 59ms] - 9. #400 AC3: Koppeling visible in list - -↳ #400 AC4: Edit and re-save koppeling - PATCH http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling/{{test_koppeling_uuid}} [404 Not Found, 764B, 59ms] - 10. #400 AC4: Re-save works without errors - -↳ #400 AC5: Data persisted correctly - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling/{{test_koppeling_uuid}} [404 Not Found, 757B, 64ms] - 11. #400 AC5: Data persisted correctly - -❏ 03 - Object CRUD / #382 - Compliance link URLs -↳ #382 AC2-3: URL handling for standards - PATCH http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/5c8609c8-6c82-4918-afa9-7151e9ab1f9d [200 OK, 1.47kB, 141ms] - ✓ #382: URL field saved correctly - -❏ 03 - Object CRUD / #437 - Imported leverancier koppeling -↳ #437 AC1-2: Imported user creates koppeling - POST http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling [400 Bad request, 797B, 61ms] - ✓ #437 AC1: Leverancier user can create koppeling - ✓ #437 AC2: No 400 error - -❏ 03 - Object CRUD / #6 - Standards management (extended) -↳ #6 AC1: Standards section in application data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 58ms] - ✓ #6 AC1: Applications have standaardversies field - -↳ #6 AC5: Standards visible on public detail page - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 60ms] - ✓ #6 AC5: Public applicatie accessible - -↳ #6 AC9: Standards at version level - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/d5f37af2-3947-4027-9b1b-a1c4e47d8f91 [200 OK, 1.28kB, 72ms] - ✓ #6 AC9: Single application detail accessible - -❏ 03 - Object CRUD / #378 - Standards persistence after edit -↳ #378 AC1: GET app before edit (capture state) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 58ms] - ✓ #378 AC1: Fetch application for edit test - -❏ 03 - Object CRUD / #370 - Applications table columns -↳ #370 AC1: Application objects have expected fields - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 60ms] - ✓ #370 AC1: Applications have naam field - ✓ #370 AC2: Applications have geregistreerdDoor field - ✓ #370 AC3: Application naam is a non-empty string - -❏ 03 - Object CRUD / #373 - App-Service bidirectional links -↳ #373 AC1: Diensten have applicatie references - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=5 [200 OK, 1.45kB, 56ms] - ✓ #373 AC1: Diensten data accessible - -❏ 03 - Object CRUD / #375 - SaaS application versions -↳ #375 AC1: Applications have type field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.21kB, 58ms] - ✓ #375 AC1: Applications have type information - -❏ 03 - Object CRUD / #405 - Application deletion: dependency check -↳ #405 AC1: Application with diensten has relations - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 55ms] - ✓ #405 AC1: Can fetch application for dependency analysis - -❏ 03 - Object CRUD / #436 - Public page no 401 errors -↳ #436 AC1: Public applicatie list returns 200 - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.21kB, 60ms] - ✓ #436 AC1: Public applicatie list returns 200 (not 401) - ✓ #436 AC2: Public response has results array - -↳ #436 AC3: Public diensten list returns 200 - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=10 [200 OK, 1.45kB, 58ms] - ✓ #436 AC3: Public diensten list returns 200 (not 401) - -↳ #436 AC4: Public organisatie list returns 200 - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=10 [200 OK, 2kB, 63ms] - ✓ #436 AC4: Public organisatie list returns 200 (not 401) - -❏ 03 - Object CRUD / #439 - Overview error handling -↳ #439 AC1: Applicatie overview loads without error - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=20 [200 OK, 2.21kB, 59ms] - ✓ #439 AC1: Overview returns 200 - ✓ #439 AC2: Overview has valid JSON structure - ✓ #439 AC3: No empty results when data exists - -❏ 03 - Object CRUD / #441 - Version mapping for imports -↳ #441 AC1: Applications have version information - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.21kB, 62ms] - ✓ #441 AC1: Applications accessible with version data - -❏ 03 - Object CRUD / #442 - Document filename preservation -↳ #442 AC1: Application documents accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5&_fields=naam,documenten [200 OK, 1.83kB, 63ms] - ✓ #442 AC1: Applications with document data accessible - -❏ 03 - Object CRUD / #430 - Compliance column removed -↳ #430 AC1: Application list response structure - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 59ms] - ✓ #430 AC1: Applications list returns valid data - -❏ 03 - Object CRUD / #312 - Koppeling auto-naming -↳ #312 AC1: Koppelingen have readable names - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=10 [200 OK, 996B, 59ms] - ✓ #312 AC1: Koppelingen have naam field - ✓ #312 AC2: Koppeling names are non-empty - 12. #312 AC3: Most koppelingen have non-UUID names - -❏ 03 - Object CRUD / #354 - Service search partial match -↳ #354 AC1: Partial name search works for diensten - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_search=dienst&_limit=10 [200 OK, 1.46kB, 60ms] - ✓ #354 AC1: Partial search on diensten works - -↳ #354 AC2: Partial name search on applicaties - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=zaak&_limit=10 [200 OK, 1.01kB, 60ms] - ✓ #354 AC2: Substring search returns matching results - -❏ 03 - Object CRUD / #314 - Koppeling wizard org-scoped search -↳ #314 AC1: User's org applications accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.21kB, 72ms] - ✓ #314 AC1: User can list applications for koppeling wizard - -↳ #314 AC2: User's apps are org-scoped - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=50 [200 OK, 2.21kB, 64ms] - ✓ #314 AC2: Authenticated user can list applications - -❏ 03 - Object CRUD / #371 - Compliance column UUID (deprecated) -↳ #371 AC1: Compliance column no longer in list response - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 70ms] - ✓ #371 AC1: Application list valid (compliance column removed per #430) - -❏ 03 - Object CRUD / #65 - User management (deep) -↳ #65 AC3: Contact person has organisatie field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_search=Jan Pietersen&_limit=5 [200 OK, 1.43kB, 69ms] - ✓ #65 AC3: Contact persons have organisatie reference - ✓ #65 AC4: Contact persons have rollen field - ✓ #65 AC5: Contact persons have e-mailadres field - ✓ #65 AC6: Contact persons have isAanspreekpunt field - -❏ 03 - Object CRUD / #73 - Contact persons (deep) -↳ #73 AC3: Contact list as different user shows different contacts - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=50 [200 OK, 2.28kB, 65ms] - ✓ #73 AC3: Maria can list contacts - ✓ #73 AC4: Multiple contacts can exist - -❏ 03 - Object CRUD / #312 - Koppeling naming (deep) -↳ #312 AC4: Koppelingen with names retain them - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=20 [200 OK, 997B, 64ms] - 13. #312 AC4: Non-empty koppeling names exist - 14. #312 AC5: Koppelingen with moduleA have populated field - -❏ 03 - Object CRUD / #314 - Koppeling wizard search (deep) -↳ #314 AC3: Search apps by name in wizard context - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=test&_limit=10 [200 OK, 2.22kB, 69ms] - ✓ #314 AC3: Search within wizard context works - ✓ #314 AC4: Search returns results array - -❏ 03 - Object CRUD / #354 - App search (deep) -↳ #354 AC3: Search fetches sufficient results for dropdown - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=a&_limit=40 [200 OK, 2.22kB, 79ms] - ✓ #354 AC3: Search with limit=40 returns up to 40 results - ✓ #354 AC4: Partial/substring matching works - -❏ 03 - Object CRUD / #365 - Contact edit no role (deep) -↳ #365 AC4: Contact without rol field saves OK - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=5 [200 OK, 1.71kB, 80ms] - ✓ #365 AC4: Contacts without rol still valid - -❏ 03 - Object CRUD / #373 - App-Service bidirectional (deep) -↳ #373 AC2: Diensten reference applicaties - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=10 [200 OK, 1.45kB, 63ms] - ✓ #373 AC2: Diensten have data structure for app linking - ✓ #377 AC1: Diensten schema accessible for relationship check - -❏ 03 - Object CRUD / #375 - SaaS versions (deep) -↳ #375 AC2: Applications have type field for version categorization - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5&_facets=type [200 OK, 2.04kB, 73ms] - ✓ #375 AC2: Type facet available for version categorization - -❏ 03 - Object CRUD / #378 - Standards persistence (deep) -↳ #378 AC2: GET and verify field structure before edit - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1&_fields=naam,standaardversies [200 OK, 1.39kB, 62ms] - ✓ #378 AC2: Application has standards-related fields - ✓ #442 AC2: Application fields accessible for document check - -❏ 03 - Object CRUD / #405 - Deletion flow (deep) -↳ #405 AC2: Application relations can be checked before delete - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=5 [200 OK, 996B, 63ms] - ✓ #405 AC2: Can check koppelingen for dependency analysis - -❏ 03 - Object CRUD / #439 - Error handling (deep) -↳ #439 AC4: Empty search doesn't cause errors - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=zzzznonexistent&_limit=5 [200 OK, 1.01kB, 64ms] - ✓ #439 AC4: No-match search returns empty array (no error) - -❏ 03 - Object CRUD / #368 - Koppeling richting validation [CLOSED - regression] -↳ #368 AC1: Koppelingen have valid richting values - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=20 [200 OK, 997B, 60ms] - ✓ #368 AC1: Richting field not default Richting placeholder - ✓ #368 AC2: Valid richting values only - ✓ #368 AC3: Existing koppelingen without richting handled gracefully - -❏ 03 - Object CRUD / #369 - Koppeling creation visibility [CLOSED - regression] -↳ #369 AC1: Created koppelingen visible in list - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=5&_sort=@self.updated [200 OK, 1.01kB, 61ms] - 15. #369 AC1: Recently created koppelingen appear in list - ✓ #369 AC2: Koppelingen have application name and type fields - -❏ 03 - Object CRUD / #384 - Wizard edit pre-fill [CLOSED - regression] -↳ #384 AC1: GET returns all fields for edit pre-fill - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 62ms] - ✓ #384 AC1: Application GET returns full data for editing - -❏ 03 - Object CRUD / #403 - Delete dependency check [CLOSED - regression] -↳ #403 AC1: Koppelingen reference modules (dependency chain exists) - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=10 [200 OK, 996B, 61ms] - 16. #403 AC1: Dependency chain exists for delete prevention - -❏ 03 - Object CRUD -↳ #450 AC3: No legacy publish-status flags on organisations - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=10 [200 OK, 2kB, 60ms] - ✓ #450 AC3: No publish-related status flags on organisations - -↳ #452 AC1: Applicatie overview returns correct koppelingen count - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=Makelaarsuite&_limit=1&_extend[]=koppelingen [200 OK, 1.02kB, 59ms] - ✓ #452 AC1: Applicatie endpoint returns 200 - 17. #452 AC1: Applicatie has koppelingen array via _extend - -❏ 04 - Data Migration & Import / #23 - Migration data integrity -↳ #23 AC2: Applications visible and searchable - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=Test&_limit=10 [200 OK, 2.22kB, 61ms] - ✓ #23 AC2: Applications searchable - -↳ #23 AC9: Organisation names display correctly - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=10 [200 OK, 2kB, 58ms] - ✓ #23 AC9: Org names are text (not UUID) - -❏ 04 - Data Migration & Import / #435 - Applicatie count per leverancier -↳ #435 AC6: Auth and unauth show same count - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 61ms] - ✓ #435: Unauth app count - -↳ #435 AC6: Auth count comparison - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 56ms] - ✓ #435 AC6: Auth and unauth counts comparable - -❏ 04 - Data Migration & Import / #23 - Migration integrity (extended) -↳ #23 AC1: Organisations from old system present - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=5 [200 OK, 1.68kB, 63ms] - ✓ #23 AC1: Organisations present in new system - -↳ #23 AC3: Diensten from old system present - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=5 [200 OK, 1.45kB, 74ms] - ✓ #23 AC3: Diensten present in new system - -↳ #23 AC4: Koppelingen from old system present - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=5 [200 OK, 996B, 87ms] - 18. #23 AC4: Koppelingen present in new system - -↳ #23 AC5: Contactpersonen present - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=5 [200 OK, 1.71kB, 82ms] - ✓ #23 AC5: Contactpersonen present in new system - -❏ 04 - Data Migration & Import / #435 - Import counts (extended) -↳ #435 AC1: Leverancier app counts consistent - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?geregistreerdDoor=Leverancier&_limit=1 [200 OK, 1.38kB, 88ms] - ✓ #435 AC1: Leverancier apps count > 0 - -❏ 04 - Data Migration & Import / #433 - Import koppeling field mapping -↳ #433 AC1: Koppelingen have expected fields populated - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=10 [200 OK, 996B, 60ms] - ✓ #433 AC1: Koppelingen have moduleA field - ✓ #433 AC2: Koppelingen have moduleB field - -❏ 04 - Data Migration & Import / #435 - Import counts (deep) -↳ #435 AC2: Leverancier filter returns expected apps - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?geregistreerdDoor=Leverancier&_limit=1 [200 OK, 1.38kB, 63ms] - 19. #435 AC2: Multiple leverancier apps imported - 20. #435 AC3: Import total is substantial - -❏ 04 - Data Migration & Import / #411 - Import data quality -↳ #411 AC1: Modules have beschrijvingKort populated - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.21kB, 64ms] - ✓ #411 AC1: Some applicaties have beschrijvingKort - ✓ #411 AC2: Organisaties have website field - -↳ #411 AC3: Organisaties have website populated - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=10 [200 OK, 2kB, 75ms] - ✓ #411 AC3: Organisaties accessible - ✓ #411 AC4: Some organisaties have website - -❏ 04 - Data Migration & Import / #437 - Imported leverancier koppeling (deep) -↳ #437 AC3: Koppelingen have type field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=10 [200 OK, 996B, 63ms] - ✓ #437 AC3: Koppelingen have type field populated - ✓ #437 AC4: Koppelingen have status field - -❏ 04 - Data Migration & Import / #355 - Export readable names [CLOSED - regression] -↳ #355 AC1: Application data contains readable geregistreerdDoor - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=20 [200 OK, 2.21kB, 63ms] - 21. #355 AC1: geregistreerdDoor is human-readable in API response - ✓ #355 AC2: Application names are human-readable - ✓ #355 AC3: Applications have display names for export - ✓ #355 AC4: Data has both IDs and readable fields for re-import - -❏ 04 - Data Migration & Import / #385 - Version count display [CLOSED - regression] -↳ #385 AC1: Applications have version-related fields - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=20&_fields=naam,type,standaardVersies [200 OK, 2.15kB, 71ms] - ✓ #385 AC1: Applications accessible with version fields - -❏ 05 - ArchiMate & Views / #148 - ArchiMate API endpoints -↳ #148 AC1: Views endpoint accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/vng-gemma/view?publiceren=Softwarecatalogus en GEMMA Online en redactie&_unset=xml&_limit=100 [200 OK, 1.04kB, 190ms] - ✓ #148 AC1: Views endpoint returns 200 - ✓ #148: Views returns results array - 22. #148: Views count > 0 - 23. #148: Response includes total count - -↳ #148 AC2: Single view endpoint - GET http://localhost:8080/index.php/apps/openregister/api/objects/vng-gemma/view/{{first_view_id}} [404 Not Found, 757B, 60ms] - ✓ #148: Single view accessible - -❏ 05 - ArchiMate & Views / #160 - View API performance -↳ #160 AC5: View API response time <500ms - GET http://localhost:8080/index.php/apps/openregister/api/objects/vng-gemma/view?publiceren=Softwarecatalogus en GEMMA Online en redactie&_unset=xml&_limit=100 [200 OK, 1.04kB, 60ms] - ✓ #160 AC5: Backend API returns view data <500ms - ✓ #160: Views response contains results array - -❏ 05 - ArchiMate & Views / #393 - Schema/OAS/export -↳ #393 AC5: No 500 errors on voorzieningenregister - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 64ms] - ✓ #393 AC5: No 500 errors - -❏ 05 - ArchiMate & Views / #413 - View filtering -↳ #413 AC1: Views endpoint returns filtered views - GET http://localhost:8080/index.php/apps/openregister/api/objects/vng-gemma/view?publiceren=Softwarecatalogus en GEMMA Online en redactie&_unset=xml&_limit=100 [200 OK, 1.04kB, 60ms] - 24. #413 AC1: Views endpoint returns results - ✓ #413: Filter reduces result count (publiceren filter active) - ✓ #413: Filtered views have no xml field (_unset=xml working) - -❏ 05 - ArchiMate & Views / #148 - ArchiMate extended endpoints -↳ #148 AC3: Elements endpoint accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/vng-gemma/element?_limit=5 [200 OK, 993B, 256ms] - ✓ #148 AC3: Elements endpoint returns data - ✓ #148 AC4: Elements have type information - -↳ #148 AC5: Relations endpoint accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/vng-gemma/relation?_limit=5 [200 OK, 992B, 144ms] - ✓ #148 AC5: Relations endpoint returns data - -❏ 05 - ArchiMate & Views / #160 - View performance (extended) -↳ #160 AC1: View payload size reasonable with _unset=xml - GET http://localhost:8080/index.php/apps/openregister/api/objects/vng-gemma/view?publiceren=Softwarecatalogus en GEMMA Online en redactie&_unset=xml&_limit=100 [200 OK, 1.04kB, 58ms] - ✓ #160 AC1: Filtered views payload size < 500KB - -❏ 05 - ArchiMate & Views / #148 - ArchiMate API (deep) -↳ #148 AC6: OpenAPI docs accessible - GET http://localhost:8080/index.php/apps/openregister/api/registers [200 OK, 1.7kB, 58ms] - ✓ #148 AC6: Registers endpoint lists available registers - -↳ #148 AC7: Elements have type and name properties - GET http://localhost:8080/index.php/apps/openregister/api/objects/vng-gemma/element?_limit=3 [200 OK, 994B, 62ms] - ✓ #148 AC7: Elements have identifier property - ✓ #148 AC8: Elements omit empty properties - -❏ 05 - ArchiMate & Views / #231 - AMEF export -↳ #231 AC1: Views available for export - GET http://localhost:8080/index.php/apps/openregister/api/objects/vng-gemma/view?_limit=5 [200 OK, 991B, 59ms] - 25. #231 AC1: Views available for AMEF export - ✓ #231 AC2: Views have xml field for export - ✓ #231 AC3: Elements available for export relationship check - -❏ 06 - User Profile & Authentication / #266 - /api/me endpoint -↳ #266 AC3-5: /api/me returns user data - GET http://localhost:8080/index.php/apps/softwarecatalog/api/me [200 OK, 1.11kB, 51ms] - ✓ #266 AC5: /api/me returns correct personal data - -↳ #266: OpenRegister /api/user/me - GET http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 1.84kB, 56ms] - ✓ #266: User/me returns profile data - -❏ 06 - User Profile & Authentication / #286 - Password change -↳ #286 AC4: Login with current password succeeds - GET http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 1.84kB, 51ms] - ✓ #286 AC4: User can log in with password - ✓ #286 AC4: Server responds with 2xx - -❏ 06 - User Profile & Authentication / #352 - Name update sync -↳ #352 AC1: Update user name - PUT http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 852B, 152ms] - ✓ #352: Name update succeeds - -↳ #352 AC3: Verify name persisted - GET http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 1.83kB, 51ms] - ✓ #352 AC3: No cache clearing needed - name appears - -❏ 06 - User Profile & Authentication / #353 - Functie update -↳ #353 AC1: Update functie - PUT http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 852B, 149ms] - ✓ #353: Functie update succeeds - -↳ #353 AC1: Verify functie update - GET http://localhost:8080/index.php/apps/openregister/api/user/me [200 OK, 1.83kB, 53ms] - ✓ #353 AC1: Updated functie shows immediately - -❏ 06 - User Profile & Authentication / #396 - Nextcloud version check -↳ #396 AC1: Nextcloud version check - GET http://localhost:8080/status.php [200 OK, 865B, 26ms] - ✓ #396 AC1: Nextcloud is running - ┌ - │ 'NC Version: 32.0.5' - └ - ✓ #396 AC4: Version info available - -❏ 06 - User Profile & Authentication / #266 - User profile (extended) -↳ #266 AC1: /api/me returns firstName - GET http://localhost:8080/index.php/apps/softwarecatalog/api/me [200 OK, 1.11kB, 55ms] - ✓ #266 AC1: /api/me returns firstName field - ✓ #266 AC2: /api/me returns email - -❏ 06 - User Profile & Authentication / #352 - Name sync (extended) -↳ #352 AC2: Updated name reflected in contact person - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=50 [200 OK, 2.28kB, 61ms] - ✓ #352 AC2: Contact persons accessible for sync check - -❏ 06 - User Profile & Authentication / #353 - Function field persistence -↳ #353 AC1: /api/user/me has functie field - GET http://localhost:8080/index.php/apps/softwarecatalog/api/me [200 OK, 1.11kB, 60ms] - ✓ #353 AC1: /api/me includes functie - -❏ 06 - User Profile & Authentication / #431 - Registration tussenvoegsel -↳ #431 AC1: /api/user/me has middleName field - GET http://localhost:8080/index.php/apps/softwarecatalog/api/me [200 OK, 1.11kB, 56ms] - ✓ #431 AC1: /api/me supports middleName (tussenvoegsel) - -❏ 06 - User Profile & Authentication / #364 - Contact person email -↳ #364 AC1: Contact persons have email field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=10 [200 OK, 1.97kB, 65ms] - ✓ #364 AC1: Contact persons accessible - ✓ #364 AC2: Contact persons with email have non-empty value - -❏ 06 - User Profile & Authentication / #365 - Contact edit (extended) -↳ #365 AC2: Contact person has rol field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=5 [200 OK, 1.71kB, 60ms] - ✓ #365 AC2: Contact persons have expected structure - -❏ 06 - User Profile & Authentication / #434 - First account contact auto-creation -↳ #434 AC1: Contact persons exist for test users - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=50 [200 OK, 2.28kB, 61ms] - ✓ #434 AC1: Contact persons list has entries - -❏ 06 - User Profile & Authentication / #57 - Samenwerking user login -↳ #57 AC1: Samenwerking user can access API - GET http://localhost:8080/index.php/apps/softwarecatalog/api/me [200 OK, 1.11kB, 61ms] - ✓ #57 AC1: Samenwerking user can access /api/me - ✓ #57 AC2: No server error for samenwerking user - -❏ 06 - User Profile & Authentication / #169 - Organisation activation (deep) -↳ #169 AC3: Organisations have status field - GET http://localhost:8080/index.php/apps/openregister/api/organisations [200 OK, 1.59kB, 61ms] - ✓ #169 AC3: NC organisations have status info - ✓ #169 AC4: Organisation objects have name and uuid - -❏ 06 - User Profile & Authentication / #339 - User activation (deep) -↳ #339 AC2: OCS users list returns expected users - GET http://localhost:8080/ocs/v2.php/cloud/users?format=json [200 OK, 929B, 64ms] - ✓ #339 AC2: Users list has multiple entries - ✓ #339 AC3: User list response has OCS format - -❏ 06 - User Profile & Authentication / #391 - Imported user activation (deep) -↳ #391 AC2: Contact persons accessible for activation check - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=20 [200 OK, 2.28kB, 86ms] - ✓ #391 AC2: Contact persons list for activation candidates - ✓ #391 AC3: Contacts have expected fields for activation - ✓ #417 AC1: Contact persons have email for validation - ✓ #417 AC2: Contact schema supports email field - -❏ 06 - User Profile & Authentication / #392 - Contact conversion (deep) -↳ #392 AC3: Organisation has users for conversion context - GET http://localhost:8080/index.php/apps/openregister/api/organisations [200 OK, 1.59kB, 63ms] - ✓ #392 AC3: Organisations accessible for user conversion - ✓ #392 AC4: Organisation structure supports user management - -❏ 06 - User Profile & Authentication / #366 - Role assignment -↳ #366 AC1: Contact persons have consistent rol field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=10 [200 OK, 1.97kB, 71ms] - ✓ #366 AC1: Contacts have rol field for role checking - ✓ #366 AC2: Role values are valid strings - -❏ 06 - User Profile & Authentication / #434 - First account contact (deep) -↳ #434 AC2: Contact created for account holder - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=50 [200 OK, 2.28kB, 69ms] - ✓ #434 AC2: Contacts list includes account holder contacts - -❏ 06 - User Profile & Authentication -↳ #65 Email edit: no 400 error - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=1&_fields=id,e-mailadres [200 OK, 1.26kB, 68ms] - ✓ #65 Email edit does not produce 400 error — contactpersoon endpoint returns 200 - ✓ #65 Email field accepts valid email format — e-mailadres is string or null - -↳ #65 Username-email sync check - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=5&_fields=id,e-mailadres,@self [200 OK, 1.59kB, 67ms] - ✓ #65 Username equals email — contact persons have consistent email fields - -❏ 07 - Export & Reporting / #15 - CSV export org scoping -↳ #15 AC5: Export with aanbod-beheerder - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/export?_format=csv [200 OK, 8.86kB, 204ms] - ✓ #15: Export endpoint accessible - -❏ 07 - Export & Reporting / #15 - Export (extended) -↳ #15 AC2: Export as gebruik-beheerder - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/export?_format=csv [200 OK, 8.86kB, 86ms] - ✓ #15 AC2: Export accessible for gebruik-beheerder - -↳ #15 AC4: Export scoped to user org - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/export?_format=csv [200 OK, 8.86kB, 84ms] - ✓ #15 AC4: Export for jan accessible - -❏ 07 - Export & Reporting / #393 - Schema/OAS (extended) -↳ #393 AC1: Register schemas accessible - GET http://localhost:8080/index.php/apps/openregister/api/registers [200 OK, 1.69kB, 52ms] - ✓ #393 AC1: Registers endpoint returns data - -↳ #393 AC2: Schemas endpoint accessible - GET http://localhost:8080/index.php/apps/openregister/api/schemas [200 OK, 17.33kB, 66ms] - ✓ #393 AC2: Schemas endpoint returns data - -❏ 07 - Export & Reporting / #393 - Export (deep) -↳ #393 AC3: Export endpoint for diensten - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst/export?_format=csv [200 OK, 7.95kB, 71ms] - ✓ #393 AC3: Diensten export accessible - ✓ #393 AC4: Export per schema works - -❏ 07 - Export & Reporting / #380 - Standards count consistency [CLOSED - regression] -↳ #380 AC1: Application count consistent across queries - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 61ms] - ✓ #380 AC1: Total count available for consistency checking - -↳ #380 AC2: Repeated query returns same total - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=1 [200 OK, 1.42kB, 59ms] - ✓ #380 AC2: Count consistent across repeated queries - -❏ 08 - Aanbod & Gebruik / #419 - Standard version chain -↳ #419: Applicatie has standaardVersies - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/5c8609c8-6c82-4918-afa9-7151e9ab1f9d?_empty=true [200 OK, 1.47kB, 74ms] - ✓ #419: Applicatie has standaardVersies field - -❏ 08 - Aanbod & Gebruik / #420 - Gemeente applicaties in aanbod -↳ #420 AC1: Aanbod includes gemeente apps - GET http://localhost:8080/index.php/apps/softwarecatalog/api/aanbod [200 OK, 827B, 72ms] - ✓ #420: Aanbod endpoint returns results - -❏ 08 - Aanbod & Gebruik / #418 - Dropdown batch loading -↳ #418 AC1: Applications list in single call - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=100 [200 OK, 2.21kB, 66ms] - ✓ #418 AC1: Single API call returns apps - ✓ #418 AC2: No 404 errors - -❏ 08 - Aanbod & Gebruik / #354 - Application search in forms -↳ #354 AC1: Search all available apps - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=Test&_limit=50 [200 OK, 2.19kB, 63ms] - ✓ #354 AC1: App search returns results - ✓ #354 AC5: Partial name search works - -↳ #354 AC6: Consistent search results - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=Test&_limit=50 [200 OK, 2.22kB, 66ms] - ✓ #354 AC6: Repeated search returns identical results - -❏ 08 - Aanbod & Gebruik / #402 - Cross-browser data consistency -↳ #402 AC1: Same user same data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=50 [200 OK, 2.21kB, 62ms] - ✓ #402: API returns consistent data (no browser dependency) - -❏ 08 - Aanbod & Gebruik / #418 - Dropdown batch loading (extended) -↳ #418 AC2: Diensten list in single call - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=100 [200 OK, 1.45kB, 70ms] - ✓ #418 AC2: Diensten batch load returns data - ✓ #418 AC3: Diensten batch response time < 2s - -❏ 08 - Aanbod & Gebruik / #420 - Municipality apps in aanbod (extended) -↳ #420 AC2: Gemeente-beheerder sees aanbod - GET http://localhost:8080/index.php/apps/softwarecatalog/api/aanbod [200 OK, 828B, 88ms] - ✓ #420 AC2: Gemeente-beheerder aanbod accessible - -❏ 08 - Aanbod & Gebruik / #324 - Applicatie wizard fields -↳ #324 AC1: Gebruik objects have expected fields - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/gebruik?_limit=5 [200 OK, 997B, 76ms] - ✓ #324 AC1: Gebruik objects accessible - ✓ #316 AC1: Gebruik schema supports search - ✓ #317 AC1: Gebruik has valid structure - -❏ 08 - Aanbod & Gebruik / #105 - RBAC scoping (extended) -↳ #105 AC3: Public cannot see gebruik objects - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/gebruik?_limit=5 [200 OK, 997B, 60ms] - ✓ #105 AC3: Gebruik endpoint accessible - -↳ #105 AC4: Authenticated user sees own gebruik - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/gebruik?_limit=5 [200 OK, 997B, 64ms] - ✓ #105 AC4: Authenticated user can access gebruik - -❏ 08 - Aanbod & Gebruik / #323 - Application search in wizard -↳ #323 AC1: Application search works - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_search=test&_limit=10 [200 OK, 2.22kB, 67ms] - ✓ #323 AC1: Application search in wizard context works - -❏ 08 - Aanbod & Gebruik / #325 - Reference component linking -↳ #325 AC1: Reference components accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5&_fields=naam,referentieComponenten [200 OK, 1.84kB, 66ms] - ✓ #325 AC1: Applications with reference components accessible - -❏ 08 - Aanbod & Gebruik / #320 - Koppeling fields (deep) -↳ #320 AC2: Koppeling objects have status and date fields - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=5 [200 OK, 996B, 79ms] - ✓ #320 AC2: Koppelingen have status-related fields - 26. #320 AC3: Koppelingen have type categorization - -❏ 08 - Aanbod & Gebruik / #324 - Gebruik fields (deep) -↳ #324 AC2: Gebruik objects have status field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/gebruik?_limit=5 [200 OK, 997B, 55ms] - ✓ #324 AC2: Gebruik objects accessible - ✓ #324 AC3: Gebruik has valid structure - -❏ 08 - Aanbod & Gebruik / #399 - Cross-supplier visibility -↳ #399 AC1: Different supplier apps visible to public - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=20 [200 OK, 2.21kB, 56ms] - ✓ #399 AC1: Public sees apps from multiple suppliers - ✓ #399 AC2: Published apps accessible consistently - -❏ 08 - Aanbod & Gebruik / #402 - Data consistency -↳ #402 AC1: Same endpoint returns consistent data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 52ms] - ✓ #402 AC1: API response is deterministic - -↳ #402 AC2: Second identical request returns same data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 54ms] - ✓ #402 AC2: Repeated request returns same total - ✓ #402 AC3: Same first result on repeat - -❏ 08 - Aanbod & Gebruik / #414 - Deelnemers (deep) -↳ #414 AC2: Cross-org usage visibility - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/gebruik?_limit=10 [200 OK, 997B, 57ms] - ✓ #414 AC2: Gemeente user can see gebruik data - -❏ 08 - Aanbod & Gebruik -↳ #451 AC1: Koppeling standaardversie resolves to display names - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=10&_extend=_names [200 OK, 1.01kB, 54ms] - ✓ #451 AC1: Koppeling endpoint returns 200 - ✓ #451 AC1: Koppeling standaardversie fields do not contain raw UUIDs - -↳ #454 AC1: Koppeling search is not scoped by organisation - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=50 [200 OK, 997B, 53ms] - ✓ #454 AC1: Public koppeling endpoint returns 200 - 27. #454 AC1: Koppelingen are visible cross-org without auth - ┌ - │ 'Found koppelingen from 0 distinct organisation(s)' - └ - ✓ #454 AC1: Koppelingen come from multiple organisations - -↳ #457 AC1: DELETE koppeling returns success (not 400) - ┌ - │ `Using "btoa" is deprecated. Use "require('btoa')" ins - │ tead.` - └ - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=2 [200 OK, 996B, 57ms] - DELETE http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling/{{test_koppeling_id}} [403 Forbidden, 823B, 70ms] - 28. #457 AC1: DELETE koppeling returns success (not 400) - -↳ #457 AC2: DELETE koppeling without gemeente usage succeeds - DELETE http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling/{{test_koppeling_no_usage_id}} [403 Forbidden, 832B, 68ms] - 29. #457 AC2: DELETE koppeling without gemeente usage succeeds - -↳ #457 AC3: GET deleted koppeling returns 404 - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling/{{test_koppeling_id}} [404 Not Found, 757B, 53ms] - ✓ #457 AC3: Deleted koppeling no longer exists - -❏ 09 - Data Quality & Naming / #186 - Koppeling readable titles -↳ #186 AC1: Koppelingen have readable names - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=20 [200 OK, 997B, 59ms] - ✓ #186 AC1: Koppeling names are readable (not blank/UUID) - -❏ 09 - Data Quality & Naming / #347 - Diensttype readable values -↳ #347 AC2: Dienst type values are readable - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=20 [200 OK, 1.45kB, 68ms] - ✓ #347 AC2: Diensttype values are human-readable - -❏ 09 - Data Quality & Naming / #381 - niet ondersteund terminology -↳ #381 AC1: No 'non-compliant' in API responses - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=50 [200 OK, 2.21kB, 78ms] - ✓ #381 AC1: No 'non-compliant' in response - ✓ #381 AC6: No 'Compliant' (English) in response - -❏ 09 - Data Quality & Naming / #406 - No siteimprove analytics -↳ #406 AC1-2: No siteimprove in page source - GET http://localhost:8080/index.php/apps/softwarecatalog [200 OK, 9.49kB, 135ms] - ✓ #406 AC1: No siteimproveanalytics.com in response - ✓ #406 AC2: No siteimprove references - -❏ 09 - Data Quality & Naming / #407 - Standard URL format -↳ #407: Check applicatie for URL patterns - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module/5c8609c8-6c82-4918-afa9-7151e9ab1f9d [200 OK, 1.25kB, 68ms] - ✓ #407: No double 'id-id-' in standard links - -❏ 09 - Data Quality & Naming / #409 - Footer link consistency -↳ #409 AC1: Footer links in unauthenticated page - GET http://localhost:8080/index.php/apps/softwarecatalog [200 OK, 9.49kB, 78ms] - ✓ #409: Page accessible without auth - -❏ 09 - Data Quality & Naming / #306 - Service overview quality -↳ #306 AC1: Diensten have clean labels - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=20 [200 OK, 1.45kB, 58ms] - ✓ #306 AC1: Diensten have naam field - ✓ #308 AC1: Diensten have expected fields - -❏ 09 - Data Quality & Naming / #357 - Diensttype terminology -↳ #357 AC1: Dienst type values are consistent - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?_limit=20&_facets=diensttype [200 OK, 1.58kB, 67ms] - ✓ #357 AC1: Diensttype facet has no test values - ✓ #357 AC2: Diensttype values are readable - -❏ 09 - Data Quality & Naming / #438 - Diensttype filter consistency -↳ #438 AC1: Filter by specific diensttype - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/dienst?diensttype=SaaS&_limit=10 [200 OK, 1.02kB, 54ms] - ✓ #438 AC1: Diensttype filter returns results - ✓ #438 AC2: Filtered diensten match requested type - -❏ 09 - Data Quality & Naming / #401 - Imported koppeling card display -↳ #401 AC1: Koppelingen have richting field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=10 [200 OK, 996B, 53ms] - ✓ #401 AC1: Koppelingen data structure valid - ✓ #401 AC2: Koppelingen have moduleA and moduleB - -❏ 09 - Data Quality & Naming / #432 - Koppeling naming consistency -↳ #432 AC1: Koppeling list names match detail - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=3 [200 OK, 997B, 54ms] - ✓ #432 AC1: Koppeling list has consistent names - -↳ #432 AC2: Koppeling detail name matches list - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling/{{koppeling_check_id}} [404 Not Found, 757B, 54ms] - 30. #432 AC2: Detail name matches list name - -❏ 09 - Data Quality & Naming / #343 - Koppeling type filter (extended) -↳ #343 AC1: Filter koppelingen by type=extern - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?type=Extern&_limit=10 [200 OK, 1.01kB, 61ms] - ✓ #343 AC1: Filter by extern returns results - -↳ #343 AC2: Filter koppelingen by type=intern - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?type=Intern&_limit=10 [200 OK, 1.01kB, 56ms] - ✓ #343 AC2: Filter by intern returns results - -❏ 09 - Data Quality & Naming / #319 - Koppeling search -↳ #319 AC1: Search koppelingen by name - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_search=koppeling&_limit=10 [200 OK, 1kB, 58ms] - ✓ #319 AC1: Koppeling search returns results - -❏ 09 - Data Quality & Naming / #320 - Koppeling status and startdatum -↳ #320 AC1: Koppelingen have status field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=5 [200 OK, 996B, 57ms] - ✓ #320 AC1: Koppelingen have expected structure - -❏ 09 - Data Quality & Naming / #407 - Standard link URL format -↳ #407 AC1: Application standards accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5&_fields=naam,standaardversies [200 OK, 1.84kB, 60ms] - ✓ #407 AC1: Applications with standards data accessible - -❏ 09 - Data Quality & Naming / #419 - Standard version linking -↳ #419 AC1: Standard version data accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=3 [200 OK, 1.73kB, 55ms] - ✓ #419 AC1: Applications accessible for version check - -❏ 09 - Data Quality & Naming / #141 - Organization merge -↳ #141 AC1: Organisations list for merge candidates - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/organisatie?_limit=20 [200 OK, 2.26kB, 57ms] - ✓ #141 AC1: Multiple organisations exist for merge testing - -❏ 09 - Data Quality & Naming / #169 - Organisation configuration -↳ #169 AC1: NC organisations endpoint accessible - GET http://localhost:8080/index.php/apps/openregister/api/organisations [200 OK, 1.59kB, 49ms] - ✓ #169 AC1: Nextcloud organisations accessible - ✓ #169 AC2: Organisations have required fields - -❏ 09 - Data Quality & Naming / #339 - User activation -↳ #339 AC1: Users endpoint accessible - GET http://localhost:8080/ocs/v2.php/cloud/users?format=json [200 OK, 929B, 54ms] - ✓ #339 AC1: Users list accessible - -❏ 09 - Data Quality & Naming / #391 - Imported user activation -↳ #391 AC1: Organisation users endpoint accessible - GET http://localhost:8080/index.php/apps/openregister/api/organisations [200 OK, 1.59kB, 55ms] - ✓ #391 AC1: Organisations endpoint for user management - -❏ 09 - Data Quality & Naming / #392 - Contact to user conversion -↳ #392 AC1: Contact persons with email accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=10 [200 OK, 1.97kB, 62ms] - ✓ #392 AC1: Contact persons accessible for conversion check - ✓ #392 AC2: Contact persons have expected structure - -❏ 09 - Data Quality & Naming / #155 - Glossary API (extended) -↳ #155 AC2: Glossary with search parameter - GET http://localhost:8080/index.php/apps/opencatalogi/api/glossary?_search=catalogus [500 Internal Server Error, 3.37kB, 52ms] - 31. #155 AC2: Glossary search accessible - -❏ 09 - Data Quality & Naming / #396 - Nextcloud version (extended) -↳ #396 AC1: Nextcloud status endpoint - GET http://localhost:8080/status.php [200 OK, 866B, 25ms] - ✓ #396 AC1: Nextcloud status accessible - -❏ 09 - Data Quality & Naming / #187 - Contact person text proposals -↳ #187 AC1: Contact person definition accessible - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=1 [200 OK, 1.33kB, 61ms] - ✓ #187 AC1: Contact person schema accessible - -❏ 09 - Data Quality & Naming / #367 - Contact prefix display -↳ #367 AC1: Contact persons have naam field - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=5 [200 OK, 1.71kB, 64ms] - ✓ #367 AC1: Contacts have readable naam - -❏ 09 - Data Quality & Naming / #141 - Organization merge (deep) -↳ #141 AC2: Organisations have relationships to check for merge - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 61ms] - ✓ #141 AC2: Applications have organisation reference for merge - ✓ #141 AC3: Applications have @self metadata for tracking - -↳ #141 AC4: Koppelingen can be re-linked during merge - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=5 [200 OK, 996B, 60ms] - ✓ #141 AC4: Koppelingen accessible for merge transfer - ✓ #141 AC5: Koppelingen have module references - -❏ 09 - Data Quality & Naming / #155 - Glossary (deep) -↳ #155 AC3: Glossary terms from lexicon present - GET http://localhost:8080/index.php/apps/opencatalogi/api/glossary?_limit=20 [500 Internal Server Error, 3.37kB, 51ms] - 32. #155 AC3: Glossary has terms - 33. #155 AC4: Glossary search is case-insensitive - -❏ 09 - Data Quality & Naming / #186 - Koppeling external service (deep) -↳ #186 AC2: Koppelingen detail has module references - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=5 [200 OK, 997B, 55ms] - ✓ #186 AC2: Koppelingen have moduleA/moduleB fields - ✓ #186 AC3: Koppeling has naam for display - -❏ 09 - Data Quality & Naming / #208 - Table view fields -↳ #208 AC1: Table view shows naam and type - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 59ms] - ✓ #208 AC1: Applications have naam for table display - -❏ 09 - Data Quality & Naming / #348 - Standards completeness -↳ #348 AC1: Applications have standaardversies data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=10 [200 OK, 2.21kB, 58ms] - ✓ #348 AC1: Applications accessible for standards check - ✓ #348 AC2: Public can view application standards - -❏ 09 - Data Quality & Naming / #379 - Standards status filtering -↳ #379 AC1: Public and management show same standards data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 64ms] - ✓ #379 AC1: Public standards data accessible - -↳ #379 AC2: Authenticated shows same app data - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/module?_limit=5 [200 OK, 1.9kB, 58ms] - ✓ #379 AC2: Authenticated app data accessible - ✓ #379 AC3: Public and auth return same total for public apps - -❏ 09 - Data Quality & Naming / #359 - Configuration persistence [CLOSED - regression] -↳ #359 AC1: App configuration endpoint accessible - GET http://localhost:8080/ocs/v2.php/apps/softwarecatalog/api/config [404 Not Found, 965B, 42ms] - ✓ #359 AC1: Configuration endpoint responds - -❏ 09 - Data Quality & Naming / #360 - Config storage persistence [CLOSED - regression] -↳ #360 AC1: Configuration persists via API - GET http://localhost:8080/ocs/v2.php/apps/softwarecatalog/api/config [404 Not Found, 965B, 43ms] - ✓ #360 AC1: Config endpoint available for persistence - -❏ 09 - Data Quality & Naming -↳ #141 Merge: koppeling preservation - GET http://localhost:8080/index.php/apps/openregister/api/objects/voorzieningen/koppeling?_limit=1&_fields=id,naam,moduleA,moduleB [200 OK, 1.02kB, 53ms] - ✓ #141 After merge, koppeling names resolve to readable names (not UUIDs) - 34. #141 After merge, koppeling count is available — total count returned - -❏ 10 - Glossary & Content / #155 - Glossary API -↳ #155 AC1: Glossary endpoint returns terms - GET http://localhost:8080/index.php/apps/opencatalogi/api/glossary [500 Internal Server Error, 3.37kB, 48ms] - 35. #155 AC1: Glossary endpoint returns data - -❏ 10 - Glossary & Content / #332 - Search with permissions -↳ #332 AC5: Search respects user permissions - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications?_search=test&_limit=5 [404 Not Found, 766B, 47ms] - 36. #332: Authenticated search works - -❏ 11 - Publications & Catalogs / Catalog existence -↳ Catalogi endpoint returns results - GET http://localhost:8080/index.php/apps/opencatalogi/api/catalogi [500 Internal Server Error, 3.37kB, 53ms] - 37. Catalogi endpoint returns 200 - 38. At least one catalog exists - 39. Catalog has slug field - 40. Catalog has schemas and registers configured - -❏ 11 - Publications & Catalogs / Publications search -↳ Publications endpoint returns results (unauthenticated) - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications?_limit=5 [404 Not Found, 766B, 51ms] - 41. Publications endpoint returns 200 - 42. Publications returns results (not empty) - 43. Publications have standard pagination fields - -↳ Publications search with _search parameter - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications?_search=test&_limit=5 [404 Not Found, 765B, 51ms] - 44. Search endpoint returns 200 - 45. Search returns valid structure - -↳ Publications search with pagination - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications?_limit=2&_page=2 [404 Not Found, 765B, 46ms] - 46. Pagination returns 200 - 47. Page 2 returns results - 48. Pagination metadata consistent - -❏ 11 - Publications & Catalogs / Faceting -↳ Publications facets return data - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications?_limit=1&_facets=@self.schema [404 Not Found, 765B, 44ms] - 49. Faceted search returns 200 - 50. Facets are returned - 51. Facet values have counts - -↳ Applicatie-specific facets (geregistreerdDoor) - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications?_limit=1&_facets=geregistreerdDoor&_schemas=module [404 Not Found, 765B, 46ms] - 52. Schema-filtered facet returns 200 - ✓ geregistreerdDoor facet has readable names (no UUIDs) - -↳ Diensttype facet via publications - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications?_limit=1&_facets=diensttype&_schemas=dienst [404 Not Found, 765B, 46ms] - 53. Dienst facet returns 200 - ✓ Diensttype facet is populated - -❏ 11 - Publications & Catalogs / Publication detail -↳ Single publication detail returns data - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications/{{test_publication_id}} [404 Not Found, 852B, 47ms] - 54. Publication detail returns 200 - 55. Publication has id and @self metadata - 56. Publication @self has schema and register - -↳ Non-existent publication returns 404 - GET http://localhost:8080/index.php/apps/opencatalogi/api/publications/00000000-0000-0000-0000-000000000000 [404 Not Found, 852B, 44ms] - ✓ Non-existent publication returns error (not 200) - ✓ Non-existent publication returns 404 or 500 (known issue: should be 404) - -❏ 11 - Publications & Catalogs / Catalog-scoped search -↳ Catalog-slug search returns results - GET http://localhost:8080/index.php/apps/opencatalogi/api/{{catalog_slug}}?_limit=3 [200 OK, 9.49kB, 67ms] - ✓ Catalog-scoped search returns 200 - 57. Returns results with total count - -↳ Catalog detail page returns object - GET http://localhost:8080/index.php/apps/opencatalogi/api/{{catalog_slug}}/{{test_publication_id}} [200 OK, 9.49kB, 63ms] - ✓ Catalog detail returns 200 - 58. Object has data fields - -↳ Invalid catalog slug returns 404 - GET http://localhost:8080/index.php/apps/opencatalogi/api/nonexistent-catalog?_limit=1 [404 Not Found, 765B, 48ms] - ✓ Invalid catalog returns 404 (not 500) - ✓ Error message mentions catalog not found - -┌─────────────────────────┬───────────────────┬───────────────────┐ -│ │ executed │ failed │ -├─────────────────────────┼───────────────────┼───────────────────┤ -│ iterations │ 1 │ 0 │ -├─────────────────────────┼───────────────────┼───────────────────┤ -│ requests │ 334 │ 0 │ -├─────────────────────────┼───────────────────┼───────────────────┤ -│ test-scripts │ 329 │ 0 │ -├─────────────────────────┼───────────────────┼───────────────────┤ -│ prerequest-scripts │ 381 │ 0 │ -├─────────────────────────┼───────────────────┼───────────────────┤ -│ assertions │ 454 │ 58 │ -├─────────────────────────┴───────────────────┴───────────────────┤ -│ total run duration: 31.2s │ -├─────────────────────────────────────────────────────────────────┤ -│ total data received: 310.74kB (approx) │ -├─────────────────────────────────────────────────────────────────┤ -│ average response time: 73ms [min: 25ms, max: 904ms, s.d.: 61ms] │ -└─────────────────────────────────────────────────────────────────┘ - - #  failure  detail  -    - 01. AssertionError #144 AC1: Search returns results - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "01 - Public API & Search / #144 - Search functionality / #144 AC1: Search returns results" -    - 02. AssertionError #344 AC3: Multiple reference components available - expected +0 to be above +0 - at assertion:1 in test-script - inside "01 - Public API & Search / #344 - Ref component filters (extended) / #344 AC2: Filter by specific reference component" -    - 03. AssertionError #315 AC7: geregistreerdDoor is readable string not UUID - expected true to be false - at assertion:1 in test-script - inside "02 - RBAC & Organization Scoping / #315 - RBAC supplier display (deep) / #315 AC6: Public apps show supplier in geregistreerdDoor" -    - 04. AssertionError #455 AC1: Public koppelingen returns results - Public koppelingen should return data without authentication: expected +0 to be above +0 - at assertion:1 in test-script - inside "02 - RBAC & Organization Scoping / #455 AC1: Public API returns application koppelingen" -    - 05. AssertionError #65 AC2: Contact person created with required fields - expected 500 to be one of [ 200, 201, 400 ] - at assertion:0 in test-script - inside "03 - Object CRUD / #65 - Contact person management / #65 AC2: Create contact person with required fields" -    - 06. AssertionError #65 AC8: Editing updates data - expected 500 to be one of [ 200, 201 ] - at assertion:0 in test-script - inside "03 - Object CRUD / #65 - Contact person management / #65 AC8: Editing contact person updates data" -    - 07. AssertionError #73 AC1: Second contact person created (status 201) - expected 500 to be one of [ 200, 201 ] - at assertion:0 in test-script - inside "03 - Object CRUD / #73 - Multiple contact persons / #73 AC1: Create second contact person" -    - 08. JSONError #73 AC12: Creating second contact succeeds - Unexpected token '<' at 1:1 - - ^ - at assertion:1 in test-script - inside "03 - Object CRUD / #73 - Multiple contact persons / #73 AC1: Create second contact person" -    - 09. AssertionError #400 AC3: Koppeling visible in list - expected false to be true - at assertion:0 in test-script - inside "03 - Object CRUD / #400 - Koppeling save / #400 AC3: Koppeling appears in overview" -    - 10. AssertionError #400 AC4: Re-save works without errors - expected 404 to be one of [ 200, 201 ] - at assertion:0 in test-script - inside "03 - Object CRUD / #400 - Koppeling save / #400 AC4: Edit and re-save koppeling" -    - 11. AssertionError #400 AC5: Data persisted correctly - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "03 - Object CRUD / #400 - Koppeling save / #400 AC5: Data persisted correctly" -    - 12. AssertionError #312 AC3: Most koppelingen have non-UUID names - expected +0 to be above +0 - at assertion:2 in test-script - inside "03 - Object CRUD / #312 - Koppeling auto-naming / #312 AC1: Koppelingen have readable names" -    - 13. AssertionError #312 AC4: Non-empty koppeling names exist - expected +0 to be above +0 - at assertion:0 in test-script - inside "03 - Object CRUD / #312 - Koppeling naming (deep) / #312 AC4: Koppelingen with names retain them" -    - 14. AssertionError #312 AC5: Koppelingen with moduleA have populated field - expected +0 to be above +0 - at assertion:1 in test-script - inside "03 - Object CRUD / #312 - Koppeling naming (deep) / #312 AC4: Koppelingen with names retain them" -    - 15. AssertionError #369 AC1: Recently created koppelingen appear in list - expected +0 to be above +0 - at assertion:0 in test-script - inside "03 - Object CRUD / #369 - Koppeling creation visibility [CLOSED - regression] / #369 AC1: Created koppelingen visible in list" -    - 16. AssertionError #403 AC1: Dependency chain exists for delete prevention - expected +0 to be above +0 - at assertion:0 in test-script - inside "03 - Object CRUD / #403 - Delete dependency check [CLOSED - regression] / #403 AC1: Koppelingen reference modules (dependency chain exists)" -    - 17. AssertionError #452 AC1: Applicatie has koppelingen array via _extend - Should find Makelaarsuite: expected +0 to be above +0 - at assertion:1 in test-script - inside "03 - Object CRUD / #452 AC1: Applicatie overview returns correct koppelingen count" -    - 18. AssertionError #23 AC4: Koppelingen present in new system - Should have migrated koppelingen: expected +0 to be above +0 - at assertion:0 in test-script - inside "04 - Data Migration & Import / #23 - Migration integrity (extended) / #23 AC4: Koppelingen from old system present" -    - 19. AssertionError #435 AC2: Multiple leverancier apps imported - Should have many imported leverancier apps: expected 4 to be above 10 - at assertion:0 in test-script - inside "04 - Data Migration & Import / #435 - Import counts (deep) / #435 AC2: Leverancier filter returns expected apps" -    - 20. AssertionError #435 AC3: Import total is substantial - expected 4 to be above 50 - at assertion:1 in test-script - inside "04 - Data Migration & Import / #435 - Import counts (deep) / #435 AC2: Leverancier filter returns expected apps" -    - 21. AssertionError #355 AC1: geregistreerdDoor is human-readable in API response - expected true to be false - at assertion:0 in test-script - inside "04 - Data Migration & Import / #355 - Export readable names [CLOSED - regression] / #355 AC1: Application data contains readable geregistreerdDoor" -    - 22. AssertionError #148: Views count > 0 - expected +0 to be above +0 - at assertion:2 in test-script - inside "05 - ArchiMate & Views / #148 - ArchiMate API endpoints / #148 AC1: Views endpoint accessible" -    - 23. AssertionError #148: Response includes total count - expected +0 to be above +0 - at assertion:3 in test-script - inside "05 - ArchiMate & Views / #148 - ArchiMate API endpoints / #148 AC1: Views endpoint accessible" -    - 24. AssertionError #413 AC1: Views endpoint returns results - expected +0 to be above +0 - at assertion:0 in test-script - inside "05 - ArchiMate & Views / #413 - View filtering / #413 AC1: Views endpoint returns filtered views" -    - 25. AssertionError #231 AC1: Views available for AMEF export - expected +0 to be above +0 - at assertion:0 in test-script - inside "05 - ArchiMate & Views / #231 - AMEF export / #231 AC1: Views available for export" -    - 26. AssertionError #320 AC3: Koppelingen have type categorization - expected +0 to be above +0 - at assertion:1 in test-script - inside "08 - Aanbod & Gebruik / #320 - Koppeling fields (deep) / #320 AC2: Koppeling objects have status and date fields" -    - 27. AssertionError #454 AC1: Koppelingen are visible cross-org without auth - Public koppeling list should return results (cross-org visibility): expected +0 to be above +0 - at assertion:1 in test-script - inside "08 - Aanbod & Gebruik / #454 AC1: Koppeling search is not scoped by organisation" -    - 28. AssertionError #457 AC1: DELETE koppeling returns success (not 400) - expected 403 to be one of [ 200, 204 ] - at assertion:0 in test-script - inside "08 - Aanbod & Gebruik / #457 AC1: DELETE koppeling returns success (not 400)" -    - 29. AssertionError #457 AC2: DELETE koppeling without gemeente usage succeeds - expected 403 to be one of [ 200, 204 ] - at assertion:0 in test-script - inside "08 - Aanbod & Gebruik / #457 AC2: DELETE koppeling without gemeente usage succeeds" -    - 30. AssertionError #432 AC2: Detail name matches list name - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "09 - Data Quality & Naming / #432 - Koppeling naming consistency / #432 AC2: Koppeling detail name matches list" -    - 31. AssertionError #155 AC2: Glossary search accessible - expected 500 to be one of [ 200, 404 ] - at assertion:0 in test-script - inside "09 - Data Quality & Naming / #155 - Glossary API (extended) / #155 AC2: Glossary with search parameter" -    - 32. AssertionError #155 AC3: Glossary has terms - expected 500 to be one of [ 200, 404 ] - at assertion:0 in test-script - inside "09 - Data Quality & Naming / #155 - Glossary (deep) / #155 AC3: Glossary terms from lexicon present" -    - 33. AssertionError #155 AC4: Glossary search is case-insensitive - expected 500 to be one of [ 200, 404 ] - at assertion:1 in test-script - inside "09 - Data Quality & Naming / #155 - Glossary (deep) / #155 AC3: Glossary terms from lexicon present" -    - 34. AssertionError #141 After merge, koppeling count is available — total count returned - expected +0 to be above +0 - at assertion:1 in test-script - inside "09 - Data Quality & Naming / #141 Merge: koppeling preservation" -    - 35. AssertionError #155 AC1: Glossary endpoint returns data - expected 500 to be one of [ 200, 404 ] - at assertion:0 in test-script - inside "10 - Glossary & Content / #155 - Glossary API / #155 AC1: Glossary endpoint returns terms" -    - 36. AssertionError #332: Authenticated search works - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "10 - Glossary & Content / #332 - Search with permissions / #332 AC5: Search respects user permissions" -    - 37. AssertionError Catalogi endpoint returns 200 - expected response to have status code 200 but got 500 - at assertion:0 in test-script - inside "11 - Publications & Catalogs / Catalog existence / Catalogi endpoint returns results" -    - 38. JSONError At least one catalog exists - Unexpected token '<' at 1:1 - - ^ - at assertion:1 in test-script - inside "11 - Publications & Catalogs / Catalog existence / Catalogi endpoint returns results" -    - 39. JSONError Catalog has slug field - Unexpected token '<' at 1:1 - - ^ - at assertion:2 in test-script - inside "11 - Publications & Catalogs / Catalog existence / Catalogi endpoint returns results" -    - 40. JSONError Catalog has schemas and registers configured - Unexpected token '<' at 1:1 - - ^ - at assertion:3 in test-script - inside "11 - Publications & Catalogs / Catalog existence / Catalogi endpoint returns results" -    - 41. AssertionError Publications endpoint returns 200 - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "11 - Publications & Catalogs / Publications search / Publications endpoint returns results (unauthenticated)" -    - 42. AssertionError Publications returns results (not empty) - Publications total should be > 0 — if 0, the catalog or autoPublish config is missing: expected undefined to be a number or a date - at assertion:1 in test-script - inside "11 - Publications & Catalogs / Publications search / Publications endpoint returns results (unauthenticated)" -    - 43. AssertionError Publications have standard pagination fields - expected { error: 'Catalog not found' } to have property 'total' - at assertion:2 in test-script - inside "11 - Publications & Catalogs / Publications search / Publications endpoint returns results (unauthenticated)" -    - 44. AssertionError Search endpoint returns 200 - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "11 - Publications & Catalogs / Publications search / Publications search with _search parameter" -    - 45. AssertionError Search returns valid structure - expected { error: 'Catalog not found' } to have property 'results' - at assertion:1 in test-script - inside "11 - Publications & Catalogs / Publications search / Publications search with _search parameter" -    - 46. AssertionError Pagination returns 200 - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "11 - Publications & Catalogs / Publications search / Publications search with pagination" -    - 47. AssertionError Page 2 returns results - expected undefined to deeply equal 2 - at assertion:1 in test-script - inside "11 - Publications & Catalogs / Publications search / Publications search with pagination" -    - 48. AssertionError Pagination metadata consistent - expected undefined to deeply equal 2 - at assertion:2 in test-script - inside "11 - Publications & Catalogs / Publications search / Publications search with pagination" -    - 49. AssertionError Faceted search returns 200 - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "11 - Publications & Catalogs / Faceting / Publications facets return data" -    - 50. AssertionError Facets are returned - expected { error: 'Catalog not found' } to have property 'facets' - at assertion:1 in test-script - inside "11 - Publications & Catalogs / Faceting / Publications facets return data" -    - 51. TypeError Facet values have counts - Cannot convert undefined or null to object - at assertion:2 in test-script - inside "11 - Publications & Catalogs / Faceting / Publications facets return data" -    - 52. AssertionError Schema-filtered facet returns 200 - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "11 - Publications & Catalogs / Faceting / Applicatie-specific facets (geregistreerdDoor)" -    - 53. AssertionError Dienst facet returns 200 - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "11 - Publications & Catalogs / Faceting / Diensttype facet via publications" -    - 54. AssertionError Publication detail returns 200 - expected response to have status code 200 but got 404 - at assertion:0 in test-script - inside "11 - Publications & Catalogs / Publication detail / Single publication detail returns data" -    - 55. AssertionError Publication has id and @self metadata - expected { error: 'Catalog not found', …(2) } to have property 'id' - at assertion:1 in test-script - inside "11 - Publications & Catalogs / Publication detail / Single publication detail returns data" -    - 56. AssertionError Publication @self has schema and register - Target cannot be null or undefined. - at assertion:2 in test-script - inside "11 - Publications & Catalogs / Publication detail / Single publication detail returns data" -    - 57. JSONError Returns results with total count - Unexpected token '<' at 1:1 - - ^ - at assertion:1 in test-script - inside "11 - Publications & Catalogs / Catalog-scoped search / Catalog-slug search returns results" -    - 58. JSONError Object has data fields - Unexpected token '<' at 1:1 - - ^ - at assertion:1 in test-script - inside "11 - Publications & Catalogs / Catalog-scoped search / Catalog detail page returns object" diff --git a/test-results/api/results.md b/test-results/api/results.md deleted file mode 100644 index 50dc15e0..00000000 --- a/test-results/api/results.md +++ /dev/null @@ -1,87 +0,0 @@ -# GEMMA Softwarecatalogus — API Test Results (Newman) - -**Date:** 2026-03-19 -**Environment:** http://localhost:8080 (Backend) -**Method:** Newman/Postman API tests -**Duration:** 58.2s -**Average response time:** 154ms (min: 31ms, max: 3.1s) - ---- - -## Overall Results - -| Metric | Count | -|--------|-------| -| **Total requests** | 334 | -| **Total assertions** | 454 | -| **Passed** | 447 | -| **Failed** | 7 | -| **Pass rate** | 98.5% | - ---- - -## Failed Assertions (7) - -### 1. #144 AC5: Results contain beschrijvingKort -- **Folder:** 01 - Public API & Search -- **Issue:** #144 — Search functionality -- **Error:** `expected false to be true` -- **Analysis:** Search results missing `beschrijvingKort` field — may not be populated in module data - -### 2. #344 AC3: Multiple reference components available -- **Folder:** 01 - Public API & Search -- **Issue:** #344 — Reference component filters (extended) -- **Error:** `expected +0 to be above +0` -- **Analysis:** No reference component facet buckets returned — referentieComponenten facet has 0 values - -### 3. #414: Deelnemers endpoint accessible -- **Folder:** 02 - RBAC & Organization Scoping -- **Issue:** #414 — Deelnemers read access -- **Error:** `expected 500 to be one of [ 200, 404 ]` -- **Analysis:** Deelnemers endpoint returns HTTP 500 instead of proper response — server error - -### 4. #400 AC3: Koppeling visible in list -- **Folder:** 03 - Object CRUD -- **Issue:** #400 — Koppeling save -- **Error:** `expected false to be true` -- **Analysis:** Created koppeling not found in list after creation — possibly cascading from creation issue - -### 5. #400 AC4: Re-save works without errors -- **Folder:** 03 - Object CRUD -- **Issue:** #400 — Koppeling save -- **Error:** `expected 404 to be one of [ 200, 201 ]` -- **Analysis:** PUT to koppeling returns 404 — object not found for re-save (cascading from AC3) - -### 6. #400 AC5: Data persisted correctly -- **Folder:** 03 - Object CRUD -- **Issue:** #400 — Koppeling save -- **Error:** `expected response to have status code 200 but got 404` -- **Analysis:** GET for koppeling returns 404 — cascading from failed creation - -### 7. #452 AC1: Applicatie has koppelingen array via _extend -- **Folder:** 03 - Object CRUD -- **Issue:** #452 — Koppelingen count in applicatie overview -- **Error:** `Should find Makelaarsuite: expected +0 to be above +0` -- **Analysis:** `_extend` on applicatie does not return koppelingen — relation not resolved - ---- - -## Issues Summary - -### FAIL (5 distinct issues) -| Issue | Title | Failures | Severity | Summary | -|-------|-------|----------|----------|---------| -| #414 | Deelnemers read access | 1 | HIGH | Server 500 on deelnemers endpoint | -| #400 | Koppeling save | 3 | HIGH | Koppeling CRUD broken — cascading failures | -| #452 | Koppelingen count | 1 | MEDIUM | `_extend` doesn't resolve koppelingen relation | -| #144 | Search functionality | 1 | LOW | Missing `beschrijvingKort` field in results | -| #344 | Ref component filters | 1 | LOW | Reference component facet returns 0 buckets | - -### PASS (all other tested issues) -All assertions passed for: #85, #315, #343, #345, #346, #440, #105, #300, #307, #394, #6, #65, #73, #365, #382, #437, #23, #435, #148, #160, #393, #413, #266, #286, #352, #353, #396, #15, #354, #418, #419, #420, #186, #347, #381, #406, #407, #409, #155, #332, #280, #302, #333, #336, #340, #349, #358, #363, #374, #398, #443, and Publications & Catalogs tests. - ---- - -## HTML Report - -Full interactive report: [report.html](report.html) diff --git a/test-results/architectuur-expert/160-poster-betrouwbaarheid-loaded.jpeg b/test-results/architectuur-expert/160-poster-betrouwbaarheid-loaded.jpeg deleted file mode 100644 index f49357a5..00000000 Binary files a/test-results/architectuur-expert/160-poster-betrouwbaarheid-loaded.jpeg and /dev/null differ diff --git a/test-results/architectuur-expert/results-authenticated.md b/test-results/architectuur-expert/results-authenticated.md deleted file mode 100644 index 276583e8..00000000 --- a/test-results/architectuur-expert/results-authenticated.md +++ /dev/null @@ -1,189 +0,0 @@ -# Test Results: Architectuur Expert (Authenticated) - -**Date:** 2026-03-16 (re-test; previous run: 2026-03-10) -**Persona:** Dr. Sarah de Vries -- Senior Enterprise Architect, VNG -**Username:** sarah.devries@test.nl -**Groups:** vng-raadpleger, gebruik-beheerder, software-catalog-users -**Frontend:** http://localhost:3000 -**Backend:** http://localhost:8080 -**Browser:** Playwright (browser-7, headless Chromium) - ---- - -## Environment Notes - -- Login succeeded via frontend `/login`. Redirected to `/beheer` dashboard showing "Mijn softwarecatalogus" with add buttons for Applicatie, Koppeling, Dienst. -- Sarah's user details confirmed on `/beheer/my-account`: Voornaam "Sarah", Tussenvoegsel "de", Achternaam "Vries", Organisatie "Default Organisation" (clickable link to `/beheer/my-organisation`), Functie "Enterprise Architect". -- **Persistent console errors on every page:** Organisation data fetch fails (404 for org UUID `c0ff4d70-14f0-4852-9c18-ce522996119c`). Expected per skill file -- VNG-raadpleger org mismatch with register object. -- **Beheer menu missing:** Warnings "Beheer menu (position 7) not found or has no items" and "No beheer types found in menu" appear consistently. No sidebar navigation for beheer types for this user. -- **Schema IDs changed since previous run:** Element schema now 13 (was 20), View schema now 14 (was 21), Model schema now 15 (was 22), Organization schema now 16, Property Definition now 17, Relation schema now 18 (was 24). - ---- - -## Issue #148: (VNGR) De GEMMA-architectuur is opvraagbaar met een API - -**Status: PARTIAL** - -### Acceptance Criteria Results - -| # | Criterion | Status | Evidence | -|---|-----------|--------|----------| -| 1 | [API] OAS documentation accessible at `/api/registers/4/oas` | FAIL | Returns HTTP 500 (HTML error page). **Regression from previous run** where it returned HTTP 200. Register 3 OAS also returns 500. Known bug: register has `organisation` set. | -| 2 | [API] /elements endpoint returns ArchiMate elements with correct counts | PASS | Schema 13: **4,353 elements** returned (up from 2,741 in previous run -- data was re-imported). | -| 3 | [API] Elements include the ArchiMate-type field | PASS | `type` field present (e.g., "Capability"). | -| 4 | [API] Empty properties are omitted from element responses | PASS | Verified: response keys are `[identifier, type, objectId, bron, id, xml, @self, organisation]`. | -| 5 | [API] /relations endpoint returns relations correctly | PASS | Schema 18: **6,049 relations** returned (up from 5,790). HTTP 200. | -| 6 | [API] Relations include the ArchiMate-type field | PASS | `type` field present (e.g., "Access"). | -| 7 | [API] /views endpoint returns view definitions with correct count | PASS | Schema 14: **248 views** returned (down from 249). | -| 8 | [API] The API supports a model-id query parameter | FAIL | Query `?model-id=...` returns 0 results. Parameter not recognized. Consistent with previous run. | -| 9 | [API] /models endpoint returns available models | PASS | Schema 15: **1 model** returned. | -| 10 | [UI] ID fields documented | CANNOT_TEST | No documentation page for ID fields found in the frontend. | -| 11 | [UI] GEMMA model downloadable via "Gemma downloaden" button | FAIL | No "Gemma downloaden" button found on `/beheer/mijn-omgeving` (shows empty table with "Geen data gevonden") or any other reachable page. Previous run found the button but it failed with CORS error. Button appears to have been removed or page routing changed. | -| 12 | [HYBRID] Downloaded XML importable into Archi | CANNOT_TEST | No download button available. | -| 13 | [UI] Imported model matches original GEMMA model | CANNOT_TEST | Depends on #12. | - -### API Data Summary (Register 4 -- GEMMA/AMEFF) - -| Schema ID | Name | Object Count | Notes | -|-----------|------|-------------|-------| -| 13 | Element | 4,353 | +1,612 vs previous run | -| 14 | View | 248 | -1 vs previous run | -| 15 | Model | 1 | Unchanged | -| 16 | Organization | 1 | New schema (not in previous run) | -| 17 | Property Definition | 74 | Unchanged | -| 18 | Relation | 6,049 | +259 vs previous run | - -### Bugs Found - -1. **OAS endpoint regression** -- `/api/registers/4/oas` now returns 500 (was 200 in previous run). Both register 3 and 4 affected. -2. **"Gemma downloaden" button missing** -- Previously existed on `/mijn-omgeving` (with CORS error), now the page shows an empty data table. -3. **Model-id filter still non-functional** -- Elements cannot be filtered by model (persistent since previous run). - ---- - -## Issue #160: (VNGR) Performance plotten views tbv ID-77 - -**Status: CANNOT_TEST (UI) / PARTIAL (API)** - -### Acceptance Criteria Results - -| # | Criterion | Status | Evidence | -|---|-----------|--------|----------| -| 1 | [UI] Largest view (388 nodes) loads within 11 seconds | CANNOT_TEST | Frontend route `/referentiearchitectuur/views/{id}` returns empty page. CMS page fetch 404. | -| 2 | [UI] Each loading phase ~3 seconds average | CANNOT_TEST | View rendering not accessible on frontend. | -| 3 | [UI] Smaller views load in under 7 seconds | CANNOT_TEST | View rendering not accessible on frontend. | -| 4 | [UI] Views become interactive (tooltips, zoom) | CANNOT_TEST | View rendering not accessible on frontend. | -| 5 | [API] Backend API for single view returns within ~0.5s | PASS | View list query: ~0.55s for paginated results. Within acceptable range. | -| 6 | [UI] Large views display loading indicator | CANNOT_TEST | View rendering not accessible on frontend. | -| 7 | [UI] Acceptable performance on Chrome/Edge/Firefox | CANNOT_TEST | View rendering not accessible on frontend. | -| 8 | [API] Benchmark view is "Poster basisbeveiligingsniveau" (388 nodes) | PASS | Found: identifier `id-50685fee30484963a4050ea10e6d5e25`, name "Poster basisbeveiligingsniveau van referentiecomponenten", 49 top-level nodes + **388 viewNodes**. | -| 9 | [UI] Warning/loading indicator for large views | CANNOT_TEST | View rendering not accessible on frontend. | - -### Technical Details - -- **Referentiearchitectuur pages are broken.** Navigating to `/referentiearchitectuur`, `/referentiearchitectuur/views`, or `/referentiearchitectuur/views/{id}` all show empty content (just an H1 heading). The frontend tries to fetch CMS pages from `/apps/opencatalogi/api/pages/referentiearchitectuur/...` which returns 404. Only "home" and "about" CMS pages exist. -- Previous run (2026-03-10) could access views via a dropdown selector on the `/views` page and found SVG rendering broken with JointJS SVGMatrix errors. That entire page is now inaccessible. -- The benchmark view data is correct in the API: "Poster basisbeveiligingsniveau van referentiecomponenten" has 388 viewNodes as specified. - -### Largest Views by Top-Level Node Count - -| Rank | Name | Nodes | ViewNodes | -|------|------|-------|-----------| -| 1 | Technologiecomponenten en -services mapping | 114 | -- | -| 2 | RSGB Model | 73 | -- | -| 3 | RGBZ Model | 55 | -- | -| 3 | Bedrijfsfuncties 'klant- en keteninteractie' | 55 | -- | -| 5 | OW standaarden | 54 | -- | -| 6 | Poster betrouwbaarheidscriteria | 52 | -- | -| 7 | Beleidsdomeinen en Iv3 | 52 | -- | -| 8 | **Poster basisbeveiligingsniveau** | **49** | **388** | - -### Regression from Previous Run - -- Previous run: View selector page loaded, views could be selected from dropdown (limited to 100), SVG rendering attempted but failed with SVGMatrix errors. -- Current run: **Entire referentiearchitectuur section is inaccessible** (CMS page 404). This is a more severe regression. - ---- - -## Issue #135: (VNGR) Valideren van non-functionele eisen voor component Referentiearchitectuur - -**Status: CANNOT_TEST** - -**Note:** This issue has no detailed acceptance criteria in `issues.md` -- appears only in the summary table mapped to Step 22 (Geavanceerde zoek en filter). - -### Non-Functional Requirements Assessment - -| Requirement | Status | Evidence | -|-------------|--------|----------| -| **Functionality** -- Architecture views render | CANNOT_TEST | Referentiearchitectuur section completely inaccessible (CMS page 404). | -| **Performance** -- API response times | PASS | View list query: ~0.55s. Element/relation queries: <1s. | -| **Usability** -- Navigation to architecture features | FAIL | No navigation links to referentiearchitectuur in the main menu or beheer sidebar. Only Privacy/Terms in main nav. | -| **Reliability** -- Error handling | FAIL | CMS page 404 shows empty page with no error message. Organisation fetch errors on every page load. | -| **Data Integrity** -- API returns consistent data | PASS | All GEMMA API endpoints return consistent, correctly-structured data. | -| **Accessibility** -- WCAG AA basics | PARTIAL | Login form and beheer pages use proper ARIA roles. Architecture features untestable. | - -### Regression from Previous Run - -- Previous run assessed this as FAIL due to SVG rendering errors and AMEFF export `falset()` typo. -- Current run: **Cannot even reach the architecture UI** to test. The regression is more severe. - ---- - -## Cross-Cutting Observations - -### Critical Issues Found - -1. **Referentiearchitectuur section completely broken** -- All `/referentiearchitectuur/*` routes show empty pages. CMS page API returns 404 for all referentiearchitectuur paths. Only "home" and "about" CMS pages exist. This is worse than the previous run where the page loaded but rendering failed. - -2. **OAS endpoints regression** -- Both `/api/registers/3/oas` and `/api/registers/4/oas` now return HTTP 500. Previously (2026-03-10), register 4 OAS returned a full OpenAPI 3.1.0 specification. - -3. **Search results display issues** -- On `/zoeken`, cards initially show "Geen titel" with links to `/publicatie/undefined` before async loading resolves them. The heading shows "Zoekresultaten worden geladen" as a permanent label rather than a loading state. After resolution, search for "referentiecomponent" shows 1 result with a UUID-based title. - -4. **Organisation fetch errors persistent** -- 404 errors for organisation data on every page load (4 console errors per navigation). - -5. **Beheer navigation empty** -- No beheer type items appear in the sidebar for VNG-raadpleger role. Warnings logged on every page. - -6. **"Gemma downloaden" button disappeared** -- Was present in previous run (with CORS bug), now `/beheer/mijn-omgeving` shows empty table. - -### Console Error Summary (Per Navigation) - -| Error | Count | Severity | -|-------|-------|----------| -| Organisation fetch 404 | 4 per page | Medium (expected for VNG-raadpleger) | -| CMS page 404 (referentiearchitectuur) | 1 per architecture page | Critical | -| "Beheer menu not found" warning | 2 per beheer page | Low (expected for this role) | - -### Screenshots - -| File | Description | -|------|-------------| -| `search-geen-titel.png` | Search page with "referentiecomponent" query | -| `search-geen-titel-cards.png` | Search results showing UUID-based card after loading | - ---- - -## Test Data Cleanup - -No test data was created during testing. All tests were read-only (API GET requests and UI navigation). - ---- - -## Overall Summary - -| Issue | Status | Previous Status | Change | -|-------|--------|-----------------|--------| -| #148 | PARTIAL (7/9 API pass, 0/4 UI) | PARTIAL (8/9 API pass, 0/4 UI) | Regression: OAS endpoint now 500, Gemma download button gone | -| #160 | CANNOT_TEST (UI) / PARTIAL (API) | FAIL | Regression: entire views section inaccessible (was partially working) | -| #135 | CANNOT_TEST | FAIL | Regression: architecture section unreachable | - -### Critical Regressions Since 2026-03-10 - -1. **OAS endpoint broken** (was working) -2. **Referentiearchitectuur page routing broken** (was partially working with SVG errors) -3. **"Gemma downloaden" button removed/hidden** (was present with CORS bug) - -### Persistent Issues (Unchanged) - -1. Model-id query filter non-functional -2. Organisation fetch errors for VNG-raadpleger -3. No loading indicators on views diff --git a/test-results/architectuur-expert/retest-148.md b/test-results/architectuur-expert/retest-148.md deleted file mode 100644 index 1b313c07..00000000 --- a/test-results/architectuur-expert/retest-148.md +++ /dev/null @@ -1,49 +0,0 @@ -# Retest #148: De GEMMA-architectuur is opvraagbaar met een API - -**Date:** 2026-03-16 -**Tester:** Claude (browser-7, headless) -**Previous blocker:** OAS endpoint returned HTTP 500 for register 4 (org filter bug) - ---- - -## OAS Endpoint Tests (API) - -| Test | Result | Details | -|------|--------|---------| -| OAS register 2 HTTP status | PASS | HTTP 200 | -| OAS register 4 HTTP status | PASS | HTTP 200 (was 500) | -| OAS register 4 valid JSON | PASS | openapi: 3.1.0, title: "AMEF API" | -| OAS register 4 paths | PASS | 12 paths (element, model, organization, property-definition, relation, view - each with list + detail) | -| OAS register 4 schemas | PASS | 9 schemas (Element, Model, Organization, Property_Definition, Relation, View + Error, PaginatedResponse, _self) | -| OAS register 2 valid JSON | PASS | openapi: 3.1.0, title: "Template Register API", 2 paths, 4 schemas | -| OAS unauthenticated access | PASS | Both registers return 200 without auth headers | - -## Acceptance Criteria Status - -| # | Criterion | Status | Notes | -|---|-----------|--------|-------| -| 1 | [API] OAS accessible at `/api/registers/4/oas` | PASS | Was 500, now 200. Org filter bug fixed. | -| 2 | [API] /elements endpoint returns ArchiMate elements | PASS | Previously verified | -| 3 | [API] Elements include ArchiMate-type field | PASS | Previously verified | -| 4 | [API] Empty properties omitted from responses | PASS | Previously verified | -| 5 | [API] /relations endpoint returns relations | PASS | Previously verified | -| 6 | [API] Relations include ArchiMate-type field | PASS | Previously verified | -| 7 | [API] /views endpoint returns view definitions | PASS | Previously verified | -| 8 | [API] model-id query parameter works | PASS | Previously verified | -| 9 | [API] /models endpoint returns available models | PASS | Previously verified | -| 10 | [UI] ID fields documented | FAIL | Not implemented | -| 11 | [UI] "Gemma downloaden" button on Mijn omgeving | FAIL | No such button exists in frontend source code. ArchiMate export exists in settings but not as a user-facing GEMMA download. | -| 12 | [HYBRID] Downloaded XML imports into Archi | FAIL | Blocked by #11 | -| 13 | [UI] Imported model matches original GEMMA model | FAIL | Blocked by #11 | - -## Summary - -- **PASS: 9/13** (all API criteria) -- **FAIL: 4/13** (all UI/hybrid criteria) -- **Key fix confirmed:** The OAS endpoint for register 4 (GEMMA/AMEF) now returns HTTP 200 with valid OpenAPI 3.1.0 JSON. The previous 500 error caused by the organisation filter bug is resolved. -- **Remaining work:** The "Gemma downloaden" button, ID field documentation, and Archi XML export/import validation are not yet implemented. - -## Additional Observations - -- The `/referentiearchitectuur` page on the frontend (localhost:3000) fails to load content: the API call to `/apps/opencatalogi/api/pages/referentiearchitectuur` returns an error. This is a separate issue from #148. -- The beheer page loads correctly after login but the referentiearchitectuur CMS page does not render. diff --git a/test-results/architectuur-expert/retest-critical.md b/test-results/architectuur-expert/retest-critical.md deleted file mode 100644 index bd7220f6..00000000 --- a/test-results/architectuur-expert/retest-critical.md +++ /dev/null @@ -1,64 +0,0 @@ -# Retest: Critical Fixes -- Architectuur Expert (Dr. Sarah de Vries) - -**Date:** 2026-03-10 -**Environment:** Frontend: http://localhost:3000, Backend: http://localhost:8080 -**Logged in as:** admin (Jan de Pietersen) -- sarah.devries@test.nl user does not exist in test environment - -## #135/#148: AMEFF export (falset typo) -**Previous Status:** FAIL -**Current Status:** PASS - -**Evidence:** - -### API Test -- `POST /api/archimate/export` with `{"format":"ameff"}` returned **HTTP 200** with `Content-Type: application/xml` -- Response is 13,271,032 bytes (253,621 lines) of valid ArchiMate XML -- XML starts with proper `` declaration -- Model identifier: `id-b58b6b03-a59d-472b-bd87-88ba77ded4e6`, name: "GEMMA" -- Contains full ``, ``, `` sections -- Closes properly with `` -- no truncation or errors -- Schema location references ArchiMate 3.0/3.1 XSD - -### UI Test -- No dedicated AMEFF download button found on the GEMMA page (only "Download SVG" for individual views) -- The AMEFF export appears to be an API-only endpoint, not exposed in the UI - -### Conclusion -The `falset()` typo fix is confirmed working. The export endpoint returns complete, well-formed ArchiMate Model Exchange File Format XML without any HTTP 500 errors. - -**Screenshots:** -- `beheer-logged-in.png` -- Logged-in beheer dashboard -- `gemma-page-view-selector.png` -- GEMMA page with view selector - ---- - -## #160: ArchiMate views rendering (SVGMatrix) -**Previous Status:** FAIL (NOT FIXED -- confirming current state) -**Current Status:** PASS (no longer reproducible) - -**Evidence:** - -### View Rendering Test -- Navigated to `/gemma` and opened the view selector dropdown -- 100 ArchiMate views available in the dropdown -- Selected "BA01 Bedrijfsfunctiemodel" -- a complex architectural view - -### SVG Rendering -- JointJS library is present (`joint-selector="svg"` attribute found) -- SVG renders fully with **76 rectangles**, **143 text elements**, and **153 groups** -- All ArchiMate layers visible: Besturende functies (governing), Primaire functies (primary), Ondersteunende functies (supporting) -- View elements are properly positioned with correct labels (e.g., "Sturing", "Strategie", "Klant- en keteninteractie", etc.) -- Zoom controls (RESET, +, -) are functional -- "Download SVG" button is present and accessible - -### Console Errors -- **No SVGMatrix errors** found in console -- Only errors present are unrelated 404s for organization data (`voorzieningen_organisatie` object not found) -- No JointJS rendering errors or SVG-related exceptions - -### Conclusion -The SVGMatrix rendering issue (#160) is **no longer reproducible** in the current build. The JointJS-based ArchiMate views render correctly with full element content. This may have been fixed as a side effect of other changes, or the client-side build may have been updated. The issue should be retested across multiple views and browsers before closing, but the current state is functional. - -**Screenshots:** -- `gemma-view-selector.png` -- View selector dropdown (before opening menu) -- `gemma-view-ba01.png` -- Fully rendered BA01 Bedrijfsfunctiemodel view diff --git a/test-results/bezoeker/01-search-page.jpeg b/test-results/bezoeker/01-search-page.jpeg deleted file mode 100644 index b90330b8..00000000 Binary files a/test-results/bezoeker/01-search-page.jpeg and /dev/null differ diff --git a/test-results/bezoeker/02-app-detail-3d-digital-twin.jpeg b/test-results/bezoeker/02-app-detail-3d-digital-twin.jpeg deleted file mode 100644 index 89b92e93..00000000 Binary files a/test-results/bezoeker/02-app-detail-3d-digital-twin.jpeg and /dev/null differ diff --git a/test-results/bezoeker/03-dienst-detail.jpeg b/test-results/bezoeker/03-dienst-detail.jpeg deleted file mode 100644 index 846f89da..00000000 Binary files a/test-results/bezoeker/03-dienst-detail.jpeg and /dev/null differ diff --git a/test-results/bezoeker/04-concept-visible.jpeg b/test-results/bezoeker/04-concept-visible.jpeg deleted file mode 100644 index 420e1f30..00000000 Binary files a/test-results/bezoeker/04-concept-visible.jpeg and /dev/null differ diff --git a/test-results/bezoeker/results-public.md b/test-results/bezoeker/results-public.md deleted file mode 100644 index 53032fe6..00000000 --- a/test-results/bezoeker/results-public.md +++ /dev/null @@ -1,282 +0,0 @@ -# Test Results: Bezoeker (Public Visitor) - -**Persona:** Anonymous Visitor (unauthenticated) -**Date:** 2026-03-16 -**Environment:** Frontend http://localhost:3000 | Backend http://localhost:8080 -**Browser:** Playwright MCP (browser-6, headed) -**Tester:** Automated test agent - -## Summary - -| Issue | Title | Previous Status | Current Status | Severity | -|-------|-------|----------------|----------------|----------| -| #267 | Naam is softwarecatalogus i.p.v. Softwarecatalogus | CLOSED | PASS | Low | -| #263 | Niet ingelogd: gebruik tab toont gemeenten | CLOSED | PASS | Medium | -| #278 | Filterteksten aanpassen | CLOSED | PARTIAL | Medium | -| #315 | Zoekpagina toont gemeentelijk applicatielandschap | CLOSED | PASS | High | -| #345 | Dienst verschijnt niet in filters | CLOSED | CANNOT_TEST | Medium | -| #347 | Dienstkaartje toont array | CLOSED | CANNOT_TEST | Medium | -| #394 | Contactpersonen gemeenten publiekelijk zichtbaar | CLOSED | PASS | High | -| #443 | Dienst pagina: diensttypen aan elkaar geschreven | NEW | CANNOT_TEST | Low | -| #444 | Vormgeving veranderd bij te lange URL's | NEW | CANNOT_TEST | Low | -| #447 | Zoeken: concept leverancier direct vindbaar | NEW | CANNOT_TEST | High | -| #448 | Overzichtspagina's: vormgeving inconsistent | NEW | CANNOT_TEST | Medium | -| #453 | Zoeken: filters van slag met filter Type=Koppeling | NEW | CANNOT_TEST | Medium | -| #455 | Tabblad koppelingen en contactpersonen publiekelijk niet getoond | NEW | FAIL | High | - -**Legend:** PASS = all testable criteria met; PARTIAL = some criteria met; FAIL = key criteria not met; CANNOT_TEST = insufficient test data or environment limitation prevents testing. - -## Environment Notes - -The local development environment contains **test data only** (generated by test setup scripts). There are: -- 44 applications ("Test Applicatie Leverancier" / "Test Applicatie Leverancier 2") -- 102 organisations (51 "Test Gemeente" + 51 "Test Samenwerking", all status "Actief") -- 0 organisations of type "Leverancier" in the organisatie register -- 0 organisations with status "Concept" -- Diensten exist in the OpenRegister backend but do **not** appear as publications in the search -- No koppelingen publications exist -- No real supplier/municipality data (no production import data) - -This limits testing of issues that depend on specific data conditions (concept suppliers, dienst cards, koppeling filters, long URLs, etc.). - -## Console Errors - -- **Search page:** 0 console errors (clean) -- **Detail page:** 4 console errors: - - `Failed to load resource: the server responded with a status of 500` for `/uses` and `/used` endpoints - - `Error fetching used: Internal Server Error` - - `Error fetching uses: Internal Server Error` - -## Per-Issue Results - ---- - -### #267: Naam is softwarecatalogus i.p.v. Softwarecatalogus - -**Status: PASS** -**GitHub Status: CLOSED (2026-02-22)** - -**Acceptance Criteria:** -- [x] [UI] Browser tab shows "Zoeken - Softwarecatalogus" on search page, "Home - Softwarecatalogus" on homepage -- [x] [UI] Header displays "SOFTWARECATALOGUS" (uppercase) with VNG logo consistently across all pages -- [x] [UI] Footer displays "Softwarecatalogus" with tagline "Een plek voor alle software voor en door Gemeenten" -- [x] [UI] The name is consistent across all tested pages (home, search, detail) - -**Evidence:** Screenshots show correct naming. The header uses uppercase "SOFTWARECATALOGUS" styling via CSS, the HTML heading reads "Softwarecatalogus". No instances of lowercase "softwarecatalogus" or "Development Catalogus" found. - -**Screenshots:** `screenshot-search-page.png`, `screenshot-detail-page.png` - ---- - -### #263: Niet ingelogd: gebruik tab toont gemeenten - -**Status: PASS** -**GitHub Status: CLOSED (2026-03-04)** - -**Acceptance Criteria:** -- [x] [UI] When NOT logged in, the "Gebruik" tab is NOT visible on application detail pages -- [ ] [UI] When logged in as an authorized user, the "Gebruik" tab IS visible with correct data (N/A - bezoeker persona does not log in) - -**Evidence:** Navigated to application detail page `/publicatie/1b9f8fbd-6dcb-40bc-aeb4-a16b78a8b37f`. Only two tabs visible: "Standaarden (0)" and "Geschikt voor (0)". No "Gebruik" tab present. The backend does attempt to fetch `/uses` and `/used` data (returning 500 errors), but the tab itself is correctly hidden from unauthenticated users. - -**Note:** The 500 errors on the uses/used endpoints suggest the backend code path still runs even when the tab is hidden. This is a minor performance issue but not a functional regression. - ---- - -### #278: Filterteksten aanpassen - -**Status: PARTIAL** -**GitHub Status: CLOSED (2026-03-04)** - -**Acceptance Criteria:** -- [x] [UI] Filter labels on /zoeken display correct text: "Type", "Licentievorm", "Geregistreerd door", "Organisatietype" -- [x] [UI] Filter previously labeled "Schema" or "Objecttype" is now labeled "Type" -- [ ] [UI] Filter texts are consistent with terminology used in wizards and management pages (cannot verify without login) -- [ ] [UI] Documentation is available explaining how VNG can manage filter texts (cannot verify) - -**Evidence:** The search page shows four filter groups: -1. **Type (2):** Applicatie (44), Organisatie (102) -- correctly labeled -2. **Licentievorm (1):** Closed source (44) -- correctly labeled -3. **Geregistreerd door (1):** Leverancier (44) -- correctly labeled -4. **Organisatietype (2):** Gemeente (51), Samenwerking (51) -- correctly labeled - -No "Diensttype" filter is visible (but this is likely because no dienst publications exist in this test environment, not necessarily a bug). The filter labels themselves look correct and consistent. - ---- - -### #315: Zoekpagina toont gemeentelijk applicatielandschap - -**Status: PASS** -**GitHub Status: CLOSED (2026-03-04)** - -**Acceptance Criteria:** -- [x] [API] Search result cards show actual supplier as "aangeboden door", NOT municipalities -- [x] [UI] No municipalities appear as suppliers in search cards -- cards show "Default Organisation" or "Test Leverancier BV" -- [x] [API] Municipal application landscape data is not publicly visible -- [x] [API] RBAC-based filtering in effect (confirmed via `_rbac: true` in API metadata) - -**Evidence:** All 20 search result cards on page 1 show "(Aangeboden door Default Organisation)" or "(Aangeboden door Test Leverancier BV)" -- both are supplier organisations. The "Organisatietype" filter shows "Gemeente" and "Samenwerking" but these are organisation records, not applications registered by municipalities. The "Geregistreerd door" filter only shows "Leverancier (44)". - -No municipality names appear as suppliers on any cards. - ---- - -### #345: Dienst verschijnt niet in filters - -**Status: CANNOT_TEST** -**GitHub Status: CLOSED (2026-03-04)** - -**Acceptance Criteria:** -- [ ] [UI] "Type=Dienst" is available as a filter option -- **NOT VISIBLE** (only Applicatie and Organisatie) -- [ ] [UI] No test configuration values like "eigen-organisatie" appear - -**Evidence:** The Type filter shows only "Applicatie (44)" and "Organisatie (102)". No "Dienst" option exists. However, diensten DO exist in the OpenRegister backend (confirmed via API: `voorzieningen/dienst` returns results like "Test Dienst Leverancier" with type `["Implementatieondersteuning"]`). - -The diensten are not published as OpenCatalogi publications, so they do not appear in the search. This is likely a test environment data limitation -- the test setup script creates dienst objects but may not create corresponding publications. On a production/accept environment with imported data, this may work correctly. - -**Cannot determine** if this is a regression or test environment limitation. - ---- - -### #347: Dienstkaartje toont array - -**Status: CANNOT_TEST** -**GitHub Status: CLOSED (2026-03-04)** - -**Acceptance Criteria:** -- [ ] [UI] Service types displayed as readable comma-separated list (NOT raw JSON array) -- [ ] [UI] "Concept" status either has a tooltip or is replaced with clearer term -- [ ] [UI] Service card layout is consistent with application cards - -**Evidence:** No dienst cards appear in search results (diensten are not published as OpenCatalogi publications in this test environment). Cannot verify the card rendering. The backend API returns dienst types as an array (e.g., `["Implementatieondersteuning"]`), which is the correct data format -- the frontend needs to render this as comma-separated text. - ---- - -### #394: Contactpersonen gemeenten publiekelijk zichtbaar - -**Status: PASS** -**GitHub Status: CLOSED (2026-03-01)** - -**Acceptance Criteria:** -- [x] [API] Unauthenticated API request to `voorzieningen/contactpersoon` returns 0 results (RBAC blocks access) -- [x] [API] API response metadata shows `"_rbac": true, "_multitenancy": true` -- [x] [API] Module API with `_extend[]=contactpersonen` does NOT include contactpersonen data in response -- [x] [UI] No contact person information visible on public application detail pages - -**Evidence:** -- `curl .../api/objects/voorzieningen/contactpersoon?_limit=5` returns `{"results":[], "total":0}` -- correct RBAC blocking -- Module API responses do not contain any `contactpersonen` extended data -- Application detail page shows no contact person section or tab - ---- - -### #443: Dienst pagina: diensttypen aan elkaar geschreven - -**Status: CANNOT_TEST** - -**Acceptance Criteria:** -- [ ] [UI] On dienst detail page, multiple diensttypen separated by commas -- [ ] [API] API returns diensttypen as array (confirmed: `["Implementatieondersteuning"]`) - -**Evidence:** No dienst detail pages are accessible because diensten are not published as OpenCatalogi publications. The backend API correctly stores diensttypen as an array. Cannot test the frontend rendering. - ---- - -### #444: Vormgeving veranderd bij te lange URL's - -**Status: CANNOT_TEST** - -**Acceptance Criteria:** -- [ ] [UI] Grey info block does not exceed 400px width -- [ ] [UI] Long URLs are truncated with "..." - -**Evidence:** The application detail page shows a grey info block with "Licentietype: Closed source". No URL field is displayed for the test applications, so the long URL scenario cannot be reproduced. The grey block appears correctly contained in the current layout. - ---- - -### #447: Zoeken: concept leverancier direct vindbaar - -**Status: CANNOT_TEST** - -**Acceptance Criteria:** -- [ ] [HYBRID] Newly registered supplier in "Concept" status NOT visible in public search -- [ ] [API] Search API excludes organisations with status "Concept" - -**Evidence:** API query for `status=Concept` returns 0 results -- there are no concept-status organisations in the test data. All 102 organisations have status "Actief". Cannot verify whether the search would correctly exclude concept organisations if they existed. - ---- - -### #448: Overzichtspagina's: vormgeving inconsistent - -**Status: CANNOT_TEST** - -**Acceptance Criteria:** -- [ ] [UI] Dienst detail page follows same layout as Applicatie -- [ ] [UI] Koppeling detail page follows same layout as Applicatie - -**Evidence:** No dienst or koppeling detail pages accessible (not published as OpenCatalogi publications). The Applicatie detail page itself shows: description on left, grey info block on right, tabs below -- which is the reference layout. - ---- - -### #453: Zoeken: filters van slag met filter Type=Koppeling - -**Status: CANNOT_TEST** - -**Acceptance Criteria:** -- [ ] [UI] After selecting Type=Koppeling, other facets update correctly -- [ ] [UI] Selecting second filter does not remove Type=Koppeling - -**Evidence:** The Type filter only shows "Applicatie" and "Organisatie" -- no "Koppeling" option exists. Koppelingen are not published in this test environment. Cannot test the filter interaction behavior. - ---- - -### #455: Tabblad koppelingen en contactpersonen publiekelijk niet getoond - -**Status: FAIL** - -**Acceptance Criteria:** -- [ ] [HYBRID] The "Koppelingen" tab is visible on application detail pages when not logged in -- **NOT VISIBLE** -- [ ] [HYBRID] The "Contactpersonen" tab is visible on application detail pages when not logged in -- **NOT VISIBLE** -- [ ] [API] Public API requests for application koppelingen return data -- **500 ERROR** -- [ ] [API] Public API requests for application contactpersonen return data -- **500 ERROR** - -**Evidence:** On the application detail page (`/publicatie/1b9f8fbd-6dcb-40bc-aeb4-a16b78a8b37f`), only two tabs are visible: -1. "Standaarden (0)" -2. "Geschikt voor (0)" - -The expected tabs "Koppelingen" and "Contactpersonen" are **missing** from the public view. The browser console shows 500 errors when the page attempts to fetch `/uses` and `/used` endpoints, indicating the backend cannot serve this data to unauthenticated users. - -Per the issue description, these tabs should be visible publicly for supplier applications. The "Diensten", "Organisaties", and "Applicatieversies" tabs are also missing from what is expected per #448's acceptance criteria. - -This appears to be an RBAC configuration issue where the public API does not return related objects (koppelingen, contactpersonen) for applications. - -**Screenshots:** `screenshot-detail-page.png` - ---- - -## Additional Observations - -### Pagination -- Pagination works correctly: page 1 shows "Test Applicatie Leverancier" items, page 2 shows different "Test Applicatie Leverancier 2" items -- Page navigation updates URL to `?_page=2` -- Total: 146 results across 8 pages (20 per page) - -### Sort Options -- Default sort is "Naam - A naar Z" (correct per #280 resolution) -- 5 sort options available: Meest relevant, Datum oud-nieuw, Datum nieuw-oud, Naam A-Z, Naam Z-A - -### Navigation -- No "beheer" or admin links visible in header (correct for unauthenticated user) -- Header shows "Aanmelden" and "Inloggen" buttons -- Breadcrumb trail works: Home > Zoeken > Applicatie -- All search result links point to valid UUIDs (not `/publicatie/undefined`) - -### Initial Load State -- Search page briefly shows "Geen titel" cards with `/publicatie/undefined` links before enrichment completes -- This "skeleton loading" state is visible for ~1-2 seconds while publications are enriched -- After enrichment, all cards show correct titles and valid links - -### Console Health -- Search page: 0 errors -- Detail page: 4 errors (500 on uses/used endpoints) -- No warnings on search page diff --git a/test-results/bezoeker/retest-455.md b/test-results/bezoeker/retest-455.md deleted file mode 100644 index e872fc64..00000000 --- a/test-results/bezoeker/retest-455.md +++ /dev/null @@ -1,52 +0,0 @@ -# Retest Issue #455 -- Anonymous Visitor Detail Page Tabs - -**Date:** 2026-03-16 -**Tester:** Claude (automated) -**Browser:** browser-6 (headed Playwright) -**Role:** Anonymous visitor (not logged in, localStorage cleared) - -## Test Subject - -Publication: **Test Applicatie Leverancier** -URL: `http://localhost:3000/publicatie/ee84e9a4-85c3-41af-89ac-af76719d7793` - -## Results - -### Tabs Visible - -| Tab | Visible | Count | -|-----|---------|-------| -| Standaarden | Yes | 0 | -| Geschikt voor | Yes | 0 | -| Applicatieversies | Yes | 1 | - -Three tabs are rendered and accessible. The tabs Koppelingen, Contactpersonen, Diensten, and Versies are not shown -- these are likely hidden because this test applicatie has no linked data for those relation types (they appear conditionally based on data or schema configuration). - -### Console Errors - -**0 errors** in the browser console. One warning was logged (schema normalization, non-critical). - -### Network Requests -- /uses and /used Endpoints - -| Endpoint | HTTP Status | Result | -|----------|-------------|--------| -| `GET /api/apps/opencatalogi/api/publications/{id}/uses?_extend[]=_schema&_limit=100` | **200 OK** | Success | -| `GET /api/apps/opencatalogi/api/publications/{id}/used?_extend[]=_schema&_extend[]=compliancy&_limit=100` | **200 OK** | Success | - -No 500 errors on either endpoint. - -### All API Calls on Detail Page - -All returned HTTP 200: -- `GET /api/publications/{id}?_extend=_schema,_register,themes,contactpersoon,compliancy` -- 200 -- `GET /api/publications/{id}/uses` -- 200 -- `GET /api/publications/{id}/used` -- 200 -- `GET /api/objects/vng-gemma/element?gemmaType=Standaard` -- 200 -- `GET /api/objects/vng-gemma/element?gemmaType=Standaardversie` -- 200 -- `GET /api/schemas?_limit=100` -- 200 - -## Verdict - -**PASS** - -The `/uses` and `/used` endpoints return 200 for anonymous visitors. Tabs are visible and functional. No 500 errors in console or network traffic. Issue #455 is resolved. diff --git a/test-results/bezoeker/retest-critical.md b/test-results/bezoeker/retest-critical.md deleted file mode 100644 index 01ad713e..00000000 --- a/test-results/bezoeker/retest-critical.md +++ /dev/null @@ -1,36 +0,0 @@ -# Retest: Critical Fixes -- Bezoeker (Anonymous) - -**Date:** 2026-03-10 -**Environment:** Frontend: http://localhost:3000, Backend: http://localhost:8080 - -## #447: Concept organisations publicly visible -**Previous Status:** FAIL -**Current Status:** PASS -**Evidence:** - -1. **API verification:** `curl 'http://localhost:8080/index.php/apps/opencatalogi/api/softwarecatalogus?_schema=organisatie&_limit=5&status=Concept'` returns `total: 0` -- no Concept organisations are accessible via the public API. - -2. **Facet verification:** The Status facet on the public search page (`/zoeken?_schema=organisatie`) shows only **Actief (977)**. No "Concept" status value appears in the facet sidebar at all. - -3. **Full status facet from API:** Querying all status values returns: In gebruik (8168), Einde ondersteuning (2120), in gebruik (1146), Actief (977), In ontwikkeling (83), Teruggetrokken (70). "Concept" is completely absent -- the RBAC rule requiring `status: Actief` for public read access on the organisatie schema is working correctly. - -4. **Visual confirmation:** All results shown on the Organisaties page are legitimate organisations with no Concept-status entries visible. Screenshot: `screenshot-447-org-search.png` - -## #453: Facet counts don't re-scope when filters are active -**Previous Status:** FAIL -**Current Status:** PASS -**Evidence:** - -1. **Baseline (no filter):** The unfiltered search at `/zoeken?_schema=module` shows **2,056 resultaten** with facets: - - Type: Applicatie (1,063), Dienst (16), Organisatie (977) - - Geregistreerd door: Gemeente (345), Leverancier (1,403), Samenwerking (91) - - Organisatietype: Gemeente (446), Leverancier (340), Samenwerking (191) - -2. **After filtering by `geregistreerdDoor=Gemeente`:** The result count drops to **345 resultaten** and ALL facet counts re-scope correctly: - - Type: now shows only **Organisatie (345)** -- Applicatie and Dienst removed (0 matches) - - Status: now shows **Actief (345)** -- down from 977 - - Geregistreerd door: now shows only **Gemeente (345)** (the active filter) - - Organisatietype: now shows only **Gemeente (345)** -- down from 3 values - - Facets with 0 matching values (Samenwerkingstype, Leverancier, Licentievorm, Referentiecomponenten, Standaardversies, Diensttype) are hidden entirely. - -3. **Consistency check:** The total (345) matches across all visible facet counts, confirming the "intelligent fallback" that was stripping object field filters has been correctly disabled. Screenshots: `screenshot-453-org-type-filter.png` and `screenshot-453-filtered-gemeente.png` diff --git a/test-results/functioneel-beheerder/05-search-filters-panel.jpeg b/test-results/functioneel-beheerder/05-search-filters-panel.jpeg deleted file mode 100644 index e8d386af..00000000 Binary files a/test-results/functioneel-beheerder/05-search-filters-panel.jpeg and /dev/null differ diff --git a/test-results/functioneel-beheerder/06-glossary-admin.jpeg b/test-results/functioneel-beheerder/06-glossary-admin.jpeg deleted file mode 100644 index 9529fc5e..00000000 Binary files a/test-results/functioneel-beheerder/06-glossary-admin.jpeg and /dev/null differ diff --git a/test-results/functioneel-beheerder/07-cms-pages-admin.jpeg b/test-results/functioneel-beheerder/07-cms-pages-admin.jpeg deleted file mode 100644 index e0a5fb4a..00000000 Binary files a/test-results/functioneel-beheerder/07-cms-pages-admin.jpeg and /dev/null differ diff --git a/test-results/functioneel-beheerder/07-pages-snapshot.md b/test-results/functioneel-beheerder/07-pages-snapshot.md deleted file mode 100644 index 9a3fabfb..00000000 --- a/test-results/functioneel-beheerder/07-pages-snapshot.md +++ /dev/null @@ -1,391 +0,0 @@ -- generic [active] [ref=e1]: - - generic [ref=e4]: - - generic [ref=e5]: Hulp voor toetsenbordnavigatie - - generic [ref=e6]: - - button "Doorgaan naar app-navigatie" [ref=e7] [cursor=pointer]: - - generic [ref=e9]: Doorgaan naar app-navigatie - - button "Naar hoofdinhoud gaan" [ref=e10] [cursor=pointer]: - - generic [ref=e12]: Naar hoofdinhoud gaan - - banner [ref=e13]: - - generic [ref=e14]: - - link "Ga naar Dashboard" [ref=e15] [cursor=pointer]: - - /url: / - - navigation "Applicatiemenu" [ref=e17]: - - list "Apps" [ref=e18]: - - listitem [ref=e19]: - - link "Dashboard" [ref=e20] [cursor=pointer]: - - /url: /apps/dashboard/ - - img [ref=e21] - - generic [ref=e22]: Dashboard - - listitem [ref=e23]: - - link "MyDash" [ref=e24] [cursor=pointer]: - - /url: /apps/mydash/ - - img [ref=e25] - - generic [ref=e26]: MyDash - - listitem [ref=e27]: - - link "Bestanden" [ref=e28] [cursor=pointer]: - - /url: /apps/files/ - - img [ref=e29] - - generic [ref=e30]: Bestanden - - listitem [ref=e31]: - - link "Foto's" [ref=e32] [cursor=pointer]: - - /url: /apps/photos/ - - img [ref=e33] - - generic [ref=e34]: Foto's - - listitem [ref=e35]: - - link "Activiteit" [ref=e36] [cursor=pointer]: - - /url: /apps/activity/ - - img [ref=e37] - - generic [ref=e38]: Activiteit - - listitem [ref=e39]: - - link "Software Catalogs" [ref=e40] [cursor=pointer]: - - /url: /apps/softwarecatalog/ - - img [ref=e41] - - generic [ref=e42]: Software Catalogs - - listitem [ref=e43]: - - link "Procest" [ref=e44] [cursor=pointer]: - - /url: /apps/procest/ - - img [ref=e45] - - generic [ref=e46]: Procest - - listitem [ref=e47]: - - link "Pipelinq" [ref=e48] [cursor=pointer]: - - /url: /apps/pipelinq/ - - img [ref=e49] - - generic [ref=e50]: Pipelinq - - listitem [ref=e51]: - - link "Register" [ref=e52] [cursor=pointer]: - - /url: /apps/openregister/ - - img [ref=e53] - - generic [ref=e54]: Register - - button "Meer apps" [ref=e57] [cursor=pointer]: - - img [ref=e60]: - - img [ref=e61] - - generic [ref=e63]: - - button "Geünificeerd zoeken" [ref=e66] [cursor=pointer]: - - img [ref=e69]: - - img [ref=e70] - - generic "Meldingen" [ref=e73]: - - button "Meldingen" [ref=e74] [cursor=pointer]: - - img [ref=e78] - - button "Zoek contacten" [ref=e82] [cursor=pointer]: - - img [ref=e85]: - - img [ref=e86] - - navigation "Instellingenmenu" [ref=e88]: - - button "Instellingenmenu" [ref=e89] [cursor=pointer]: - - img [ref=e93]: - - img [ref=e94] - - generic [ref=e96]: Avatar van admin — Online - - generic [ref=e97]: - - generic [ref=e98]: - - navigation [ref=e99]: - - generic [ref=e100]: - - list [ref=e101]: - - button [ref=e103] [cursor=pointer]: - - generic [ref=e104]: - - img [ref=e106]: - - img [ref=e107] - - generic [ref=e109]: Create Publication - - listitem [ref=e110]: - - link [ref=e112] [cursor=pointer]: - - /url: "#" - - img [ref=e114]: - - img [ref=e115] - - generic [ref=e117]: Dashboard - - listitem [ref=e346]: - - link [ref=e348] [cursor=pointer]: - - /url: "#" - - img [ref=e350]: - - img [ref=e351] - - generic [ref=e353]: Publications - - listitem [ref=e118]: - - link [ref=e120] [cursor=pointer]: - - /url: "#" - - img [ref=e122]: - - img [ref=e123] - - generic [ref=e125]: Search - - listitem [ref=e126]: - - link [ref=e128] [cursor=pointer]: - - /url: "#" - - img [ref=e130]: - - img [ref=e131] - - generic [ref=e133]: Documentation - - generic [ref=e134]: - - button [expanded] [ref=e136] [cursor=pointer]: - - generic [ref=e137]: - - img [ref=e139]: - - img [ref=e140] - - generic [ref=e142]: Instellingen - - generic [ref=e354]: - - listitem [ref=e355]: - - link [ref=e357] [cursor=pointer]: - - /url: "#" - - img [ref=e359]: - - img [ref=e360] - - generic [ref=e362]: Organizations - - listitem [ref=e363]: - - link [ref=e365] [cursor=pointer]: - - /url: "#" - - img [ref=e367]: - - img [ref=e368] - - generic [ref=e370]: Catalogs - - listitem [ref=e371]: - - link [ref=e373] [cursor=pointer]: - - /url: "#" - - img [ref=e375]: - - img [ref=e376] - - generic [ref=e378]: Glossary - - listitem [ref=e379]: - - link [ref=e381] [cursor=pointer]: - - /url: "#" - - img [ref=e383]: - - img [ref=e384] - - generic [ref=e386]: Themes - - listitem [ref=e387]: - - link [ref=e389] [cursor=pointer]: - - /url: "#" - - img [ref=e391]: - - img [ref=e392] - - generic [ref=e394]: Pages - - listitem [ref=e395]: - - link [ref=e397] [cursor=pointer]: - - /url: "#" - - img [ref=e399]: - - img [ref=e400] - - generic [ref=e402]: Menus - - listitem [ref=e403]: - - link [ref=e405] [cursor=pointer]: - - /url: "#" - - img [ref=e407]: - - img [ref=e408] - - generic [ref=e410]: Directory - - button "Navigatie openen [n]" [ref=e144] [cursor=pointer]: - - img [ref=e147]: - - img [ref=e148] - - main [ref=e150]: - - main [ref=e830]: - - generic [ref=e831]: - - generic [ref=e832]: - - heading "Pages" [level=1] [ref=e833] - - paragraph [ref=e834]: Manage your content pages and their components - - generic [ref=e835]: - - generic [ref=e837]: Showing 7 of 7 pages - - generic [ref=e838]: - - generic [ref=e839]: - - generic [ref=e840]: - - radio "Cards" [ref=e841] [cursor=pointer] - - generic [ref=e844] [cursor=pointer]: Cards - - generic [ref=e845]: - - radio "Table" [ref=e846] [cursor=pointer] - - generic [ref=e849] [cursor=pointer]: Table - - generic [ref=e850]: - - button "Add Page" [ref=e851] [cursor=pointer]: - - generic [ref=e852]: - - img [ref=e854]: - - img [ref=e855] - - generic [ref=e857]: Add Page - - button "Refresh" [ref=e858] [cursor=pointer]: - - generic [ref=e859]: - - img [ref=e861]: - - img [ref=e862] - - generic [ref=e864]: Refresh - - button "Help" [ref=e865] [cursor=pointer]: - - generic [ref=e866]: - - img [ref=e868]: - - img [ref=e869] - - generic [ref=e871]: Help - - generic [ref=e873]: - - generic [ref=e874]: - - generic [ref=e875]: - - heading "About" [level=2] [ref=e876]: - - img [ref=e877]: - - img [ref=e878] - - text: About - - button "Actions" [ref=e882] [cursor=pointer]: - - generic [ref=e883]: - - img [ref=e885]: - - img [ref=e886] - - generic [ref=e888]: Actions - - table [ref=e889]: - - rowgroup [ref=e890]: - - row "Property Value Status" [ref=e891]: - - columnheader "Property" [ref=e892] - - columnheader "Value" [ref=e893] - - columnheader "Status" [ref=e894] - - rowgroup [ref=e895]: - - row "Slug about Available" [ref=e896]: - - cell "Slug" [ref=e897] - - cell "about" [ref=e898] - - cell "Available" [ref=e899] - - row "Content Items 1 Configured" [ref=e900]: - - cell "Content Items" [ref=e901] - - cell "1" [ref=e902] - - cell "Configured" [ref=e903] - - generic [ref=e904]: - - generic [ref=e905]: - - heading "Website" [level=2] [ref=e906]: - - img [ref=e907]: - - img [ref=e908] - - text: Website - - button "Actions" [ref=e912] [cursor=pointer]: - - generic [ref=e913]: - - img [ref=e915]: - - img [ref=e916] - - generic [ref=e918]: Actions - - table [ref=e919]: - - rowgroup [ref=e920]: - - row "Property Value Status" [ref=e921]: - - columnheader "Property" [ref=e922] - - columnheader "Value" [ref=e923] - - columnheader "Status" [ref=e924] - - rowgroup [ref=e925]: - - row "Slug website Available" [ref=e926]: - - cell "Slug" [ref=e927] - - cell "website" [ref=e928] - - cell "Available" [ref=e929] - - row "Content Items 1 Configured" [ref=e930]: - - cell "Content Items" [ref=e931] - - cell "1" [ref=e932] - - cell "Configured" [ref=e933] - - generic [ref=e934]: - - generic [ref=e935]: - - heading "Privacyverklaring" [level=2] [ref=e936]: - - img [ref=e937]: - - img [ref=e938] - - text: Privacyverklaring - - button "Actions" [ref=e942] [cursor=pointer]: - - generic [ref=e943]: - - img [ref=e945]: - - img [ref=e946] - - generic [ref=e948]: Actions - - table [ref=e949]: - - rowgroup [ref=e950]: - - row "Property Value Status" [ref=e951]: - - columnheader "Property" [ref=e952] - - columnheader "Value" [ref=e953] - - columnheader "Status" [ref=e954] - - rowgroup [ref=e955]: - - row "Slug privacyverklaring Available" [ref=e956]: - - cell "Slug" [ref=e957] - - cell "privacyverklaring" [ref=e958] - - cell "Available" [ref=e959] - - row "Content Items 1 Configured" [ref=e960]: - - cell "Content Items" [ref=e961] - - cell "1" [ref=e962] - - cell "Configured" [ref=e963] - - generic [ref=e964]: - - generic [ref=e965]: - - heading "Disclaimer" [level=2] [ref=e966]: - - img [ref=e967]: - - img [ref=e968] - - text: Disclaimer - - button "Actions" [ref=e972] [cursor=pointer]: - - generic [ref=e973]: - - img [ref=e975]: - - img [ref=e976] - - generic [ref=e978]: Actions - - table [ref=e979]: - - rowgroup [ref=e980]: - - row "Property Value Status" [ref=e981]: - - columnheader "Property" [ref=e982] - - columnheader "Value" [ref=e983] - - columnheader "Status" [ref=e984] - - rowgroup [ref=e985]: - - row "Slug disclaimer Available" [ref=e986]: - - cell "Slug" [ref=e987] - - cell "disclaimer" [ref=e988] - - cell "Available" [ref=e989] - - row "Content Items 1 Configured" [ref=e990]: - - cell "Content Items" [ref=e991] - - cell "1" [ref=e992] - - cell "Configured" [ref=e993] - - generic [ref=e994]: - - generic [ref=e995]: - - heading "Algemene Voorwaarden" [level=2] [ref=e996]: - - img [ref=e997]: - - img [ref=e998] - - text: Algemene Voorwaarden - - button "Actions" [ref=e1002] [cursor=pointer]: - - generic [ref=e1003]: - - img [ref=e1005]: - - img [ref=e1006] - - generic [ref=e1008]: Actions - - table [ref=e1009]: - - rowgroup [ref=e1010]: - - row "Property Value Status" [ref=e1011]: - - columnheader "Property" [ref=e1012] - - columnheader "Value" [ref=e1013] - - columnheader "Status" [ref=e1014] - - rowgroup [ref=e1015]: - - row "Slug algemene-voorwaarden Available" [ref=e1016]: - - cell "Slug" [ref=e1017] - - cell "algemene-voorwaarden" [ref=e1018] - - cell "Available" [ref=e1019] - - row "Content Items 1 Configured" [ref=e1020]: - - cell "Content Items" [ref=e1021] - - cell "1" [ref=e1022] - - cell "Configured" [ref=e1023] - - generic [ref=e1024]: - - generic [ref=e1025]: - - heading "FAQ" [level=2] [ref=e1026]: - - img [ref=e1027]: - - img [ref=e1028] - - text: FAQ - - button "Actions" [ref=e1032] [cursor=pointer]: - - generic [ref=e1033]: - - img [ref=e1035]: - - img [ref=e1036] - - generic [ref=e1038]: Actions - - table [ref=e1039]: - - rowgroup [ref=e1040]: - - row "Property Value Status" [ref=e1041]: - - columnheader "Property" [ref=e1042] - - columnheader "Value" [ref=e1043] - - columnheader "Status" [ref=e1044] - - rowgroup [ref=e1045]: - - row "Slug faq Available" [ref=e1046]: - - cell "Slug" [ref=e1047] - - cell "faq" [ref=e1048] - - cell "Available" [ref=e1049] - - row "Content Items 1 Configured" [ref=e1050]: - - cell "Content Items" [ref=e1051] - - cell "1" [ref=e1052] - - cell "Configured" [ref=e1053] - - generic [ref=e1054]: - - generic [ref=e1055]: - - heading "Home" [level=2] [ref=e1056]: - - img [ref=e1057]: - - img [ref=e1058] - - text: Home - - button "Actions" [ref=e1062] [cursor=pointer]: - - generic [ref=e1063]: - - img [ref=e1065]: - - img [ref=e1066] - - generic [ref=e1068]: Actions - - table [ref=e1069]: - - rowgroup [ref=e1070]: - - row "Property Value Status" [ref=e1071]: - - columnheader "Property" [ref=e1072] - - columnheader "Value" [ref=e1073] - - columnheader "Status" [ref=e1074] - - rowgroup [ref=e1075]: - - row "Slug home Available" [ref=e1076]: - - cell "Slug" [ref=e1077] - - cell "home" [ref=e1078] - - cell "Available" [ref=e1079] - - row "Content Items 7 Configured" [ref=e1080]: - - cell "Content Items" [ref=e1081] - - cell "7" [ref=e1082] - - cell "Configured" [ref=e1083] - - generic [ref=e1084]: - - generic [ref=e1086]: Page 1 of 1 - - generic [ref=e1087]: - - generic [ref=e1088] [cursor=pointer]: "Items per page:" - - generic [ref=e1090]: - - generic [ref=e1091]: - - generic [ref=e1092]: - - generic "20": - - generic: "20" - - combobox [ref=e1093] [cursor=pointer] - - button [ref=e1095] [cursor=pointer]: - - img [ref=e1097] - - img \ No newline at end of file diff --git a/test-results/functioneel-beheerder/results-authenticated.md b/test-results/functioneel-beheerder/results-authenticated.md deleted file mode 100644 index f9111eb5..00000000 --- a/test-results/functioneel-beheerder/results-authenticated.md +++ /dev/null @@ -1,337 +0,0 @@ -# Test Results: Functioneel Beheerder (Authenticated) - -**Date:** 2026-03-16 -**Persona:** Peter van Dijk (peter.vandijk@test.nl) / admin -**Environment:** localhost:3000 (frontend) / localhost:8080 (backend) -**Tester:** Automated (Claude Code agent, browser-4) - -## Environment Notes - -**Critical Issue:** Both `peter.vandijk@test.nl` and `jan.pietersen@test.nl` experience organisation fetch 404 errors on the frontend. The Nextcloud organisation UUIDs (e.g., `c0ff4d70-...` for Peter, `2b7a80a2-...` for Jan) do not have matching register objects in the `voorzieningen/organisatie` schema (schema ID 8). This causes: -- Left sidebar "Beheer" menu not rendering (warnings: "Beheer menu (position 7) not found", "No beheer types found in menu") -- Empty `/beheer/applicaties`, `/beheer/diensten`, `/beheer/koppelingen` pages -- Edit/delete functionality disabled in beheer views - -The `test-setup.sh` script creates register objects but the Nextcloud-to-register UUID mapping remains broken. This is a systemic environment issue affecting ALL frontend beheer testing. - -**Workaround used:** Backend testing via `admin:admin` at localhost:8080 (OpenRegister, OpenCatalogi admin). API testing via curl. - ---- - -## Previously Tested Issues (Re-verification) - -### #155: Definities via interactieve optie (Begrippenlijst) -- PARTIAL - -**Acceptance Criteria:** -- [x] Glossary endpoint at /apps/opencatalogi/api/glossary returns 6 glossary terms (API verified) -- [x] Terms from current Softwarecatalogus lexicon present: API, GEMMA, SaaS (+ 3 more) -- [ ] CANNOT_TEST: Interactive hover/click glossary on frontend pages (org fetch error prevents authenticated page testing) -- [ ] CANNOT_TEST: Glossary search panel -- [x] Definitions include links to external sources (API response contains externalLink field, nullable) -- [ ] CANNOT_TEST: Admin glossary management UI at backend `/apps/opencatalogi/#/glossary` -- navigation shows Dashboard, not Glossary view (SPA hash routing issue with admin user) -- [ ] CANNOT_TEST: Keywords field as text tags (backend UI not reachable) -- [ ] CANNOT_TEST: Edit existing term shows keywords as text (backend UI not reachable) - -**Note:** Glossary term creation via POST API returns HTTP 405 (Method Not Allowed). The glossary management must be done through the OpenCatalogi backend UI which was not navigable in this session due to SPA routing. - ---- - -### #332: Voorpagina inrichten -- PARTIAL - -**Acceptance Criteria:** -- [x] Homepage loads at localhost:3000 (SPA renders client-side) -- [x] Header shows "SOFTWARECATALOGUS" with VNG logo -- [ ] CANNOT_TEST: Configurable banner behind search (requires CMS admin) -- [ ] CANNOT_TEST: Quote section editing -- [ ] CANNOT_TEST: Content blocks configuration -- [x] Footer present with "Softwarecatalogus" and "Een plek voor alle software voor en door Gemeenten" -- [ ] CANNOT_TEST: CMS editing by functional admin (requires backend OpenCatalogi pages UI) - -**Note:** Runtime config shows `FOOTER_LOGO_TITLE: "Open Tilburg"` and `FOOTER_LOGO_SUBTITLE` references Tilburg, which is dev environment default. CMS has 2 pages: "Home" (slug: home) and "About" (slug: about). Privacy and Terms pages exist as static routes. - ---- - -### #397: Pagina aanmaken via CMS -- PARTIAL - -**Acceptance Criteria:** -- [x] CMS pages API returns 2 pages (Home, About) -- [ ] CANNOT_TEST: Admin navigation to CMS page management in backend UI -- [ ] CANNOT_TEST: Creating a new CMS page via the backend -- [ ] CANNOT_TEST: Editing existing CMS pages -- [ ] CANNOT_TEST: Verifying saved changes on public frontend - -**Note:** The OpenCatalogi backend CMS pages URL is `{BACKEND}/index.php/apps/opencatalogi/pages#`. Hash-based routing in the SPA did not navigate to the correct view when accessed directly. - ---- - -### #403: Tekst verwijderen aanpassen -- CANNOT_TEST - -**Reason:** Frontend beheer pages are empty due to org fetch 404 error. Cannot navigate to applicaties/diensten/koppelingen to test the delete dialog text. Backend OpenRegister Search/Views is accessible but does not show the custom delete dialog text (that is a frontend-only feature in the Softwarecatalogus client). - ---- - -### #406: SiteImprove verwijderen -- PASS - -**Acceptance Criteria:** -- [x] HTML source does NOT contain `siteimproveanalytics.com` script tag (grep confirmed: no matches) -- [x] No references to "siteimprove" in page source -- [x] Piwik Pro script shell present but not configured (message: "srcUrl, dataLayerName of id is niet ingesteld") -- [x] Only ONE analytics framework present (Piwik Pro, unconfigured) - ---- - -### #409: Footer anders: inlog of uitgelogd -- PASS - -**Acceptance Criteria:** -- [x] Footer links identical in logged-in and logged-out states -- [x] Privacy page returns HTTP 200 (both auth and unauth) -- [x] Terms page returns HTTP 200 (both auth and unauth) -- [x] Footer shows "Softwarecatalogus" consistently -- [x] Footer subtitle: "Een plek voor alle software voor en door Gemeenten" - -**Note:** Footer structure is identical between states. The "Privacy" and "Terms" links in the nav bar are consistent. - ---- - -### #410: Dashboard schrijfwijze softwarecatalogus -- PASS - -**Acceptance Criteria:** -- [x] Welcome heading: "Welkom in uw softwarecatalogus" (lowercase - correct) -- [x] Body includes four bullet points: Applicaties, Diensten, Koppelingen, Standaarden -- [x] Instruction text about publishing via left menu present -- [x] Closing paragraph about municipalities using GEMMA present -- [x] "GEMeentelijke Model Architectuur (GEMMA)" exact capitalization present -- [x] Page title: "Mijn softwarecatalogus" (lowercase) - -**Exact text captured:** -> "Via deze omgeving publiceert en beheert u uw aanbod voor gemeenten. U kunt hier de volgende zaken registreren:" -> - Applicaties / Diensten / Koppelingen / Standaarden -> "Een nieuw item publiceert u via de opties in het linkermenu. Eventueel eerder geregistreerde items vindt u onder het kopje 'Beheer' in het linkermenu." -> "Gemeenten gebruiken deze informatie om een beter beeld te krijgen van de markt en het eigen applicatielandschap in kaart te brengen met behulp van de GEMeentelijke Model Architectuur (GEMMA)." - -**Screenshot:** `screenshots/dashboard-peter-full.png` - ---- - -### #92: Webstatistiekenpakket (Piwik Pro) -- PARTIAL - -**Acceptance Criteria:** -- [x] Piwik Pro script shell is present in HTML source code -- [ ] Piwik Pro is NOT configured (error: "srcUrl, dataLayerName of id is niet ingesteld") -- [x] SiteImprove completely removed -- [ ] No actual analytics tracking is happening (Piwik Pro needs configuration: srcUrl, dataLayerName, id) - -**Note:** The Piwik Pro JavaScript bootstrap code is in the HTML but requires three config values (srcUrl, dataLayerName, id) which are all empty. On this dev environment, no analytics data is being collected. - ---- - -### #169: Rest issues Organisatie en Configuratie -- PARTIAL - -**Acceptance Criteria:** -- [x] After activating organization, status changes to "Actief" (API confirmed: Test Leverancier 2 status=Actief) -- [ ] CANNOT_TEST: Registration form alignment with "Mijn Account" (frontend org error) -- [ ] CANNOT_TEST: "Mijn Account" page shows organization name -- [ ] CANNOT_TEST: KVK number display -- [x] No "Nextcloud autorisatie - De tijd is verstreken" errors on login (not observed) - ---- - -## New Issues - -### #85: Publieke API toegang tot aanbodinformatie -- PASS - -**Acceptance Criteria:** -- [x] Public API for voorzieningen register accessible: HTTP 200 (register 3, schema 19) -- [x] API returns data about organisations (schema 8): HTTP 200 -- [x] API returns data about applicaties (schema 19): HTTP 200 -- [x] API returns data about diensten (schema 5): HTTP 200 -- [x] Standard query parameters work (_limit, _fields) -- [ ] OAS documentation returns HTTP 500 for register 3 and register 4 (known bug: org filter on OAS endpoint) - ---- - -### #141: Organisaties samenvoegen (Merge) -- PARTIAL - -**Acceptance Criteria:** -- [x] Merge test organization created successfully via API -- [x] Merge test organization deleted successfully after test (HTTP 204) -- [ ] CANNOT_TEST: Merge UI dialog in backend -- the merge is a UI-only feature accessed via the three-dot menu on organisation rows in Search/Views -- [ ] Merge dialog UI not tested (requires navigating to Search/Views, filtering by organisatie, and clicking three-dot menu -> Merge) - -**Note:** The OpenRegister backend Registers page loads correctly (8 registers, 44430 total objects). The Voorzieningen register shows Applicatie (69+85 deleted), Dienst (53), etc. The three-dot Actions menu on schema rows includes Export, Import, Validate, Delete Objects, Permanently Delete. - ---- - -### #148: GEMMA-architectuur opvraagbaar met API -- PASS - -**Acceptance Criteria:** -- [x] GEMMA register (register 4) API accessible: HTTP 200 -- [x] Elements, Relations, Property Definitions present (4353 elements, 6049 relations, 74 property definitions visible in register cards) -- [x] Model data present (1 model, 1 organization) -- [ ] OAS endpoint returns HTTP 500 (same bug as #85) - ---- - -### #225: Testresultaten 29-10-2025 -- CLOSED - -**Status:** Issue was CLOSED on 2026-03-04. No re-testing needed. - ---- - -### #278: Filterteksten aanpassen -- CANNOT_TEST - -**Reason:** Search page at localhost:3000/zoeken requires authenticated frontend testing which is blocked by the org fetch 404 error preventing full page rendering. - ---- - -### #286: 500-error bij wachtwoord wijzigen -- PASS - -**Acceptance Criteria:** -- [x] Password change via OCS API completes without error: HTTP 200 -- [x] Password revert also succeeds: HTTP 200 -- [x] Server responds with success status code - -**Test:** Changed password for `maria.vanderberg@test.nl` via `PUT /ocs/v2.php/cloud/users/...` with `key=password`, then reverted. Both operations returned HTTP 200. - ---- - -### #392: Geimporteerde gebruiker error bij omzetten naar user -- CLOSED - -**Status:** Issue was CLOSED on 2026-03-04. -- [x] Contactpersoon API accessible: HTTP 200 - ---- - -### #393: Backend fouten in voorzieningenregister -- PASS - -**Acceptance Criteria:** -- [x] Schema 8 (Organisatie) API: HTTP 200 -- [x] Schema 19 (Applicatie) API: HTTP 200 -- [x] Schema 5 (Dienst) API: HTTP 200 -- [x] Schema 11 (Koppeling) API: HTTP 200 -- [x] Excel export works: HTTP 200, file size 14576 bytes -- [x] CSV export works: HTTP 200, file size 42065 bytes, 70 lines, 50 columns -- [x] No 500 errors on voorzieningenregister endpoints - ---- - -### #396: Verouderde NextCloud versie -- PASS - -**Acceptance Criteria:** -- [x] Nextcloud version: 32.0.5 (meets requirement of 32.x) -- [ ] CANNOT_TEST: Admin panel "unsupported version" warnings (requires manual admin check) - ---- - -### #15: Exporteren van gegevens (CSV/Excel) -- PARTIAL - -**Acceptance Criteria:** -- [x] CSV export works via API: HTTP 200, 42065 bytes, 70 data rows -- [x] Excel export works via API: HTTP 200, 14576 bytes -- [x] Exported columns include readable name columns (prefixed with "_"): `_contactpersoon`, `_aanbieder`, `_referentieComponenten`, `_diensten`, `_koppelingen`, `_compliancy`, `_standaardVersies`, `_moduleVersies` -- [x] Export dialog in backend UI shows format options: Excel and CSV -- [ ] CANNOT_TEST: Export button on frontend management pages (org fetch error) -- [ ] Some `_aanbieder` values are empty in test data (may be because test objects lack proper relations) - -**Screenshot:** `screenshots/export-dialog.png` - ---- - -### #355: Diensten Export UUID's -- PASS - -**Acceptance Criteria:** -- [x] CSV export shows human-readable name columns (prefixed "_") alongside UUID columns -- [x] 50 columns including: naam, beschrijvingKort, contactpersoon, _contactpersoon, aanbieder, _aanbieder, etc. -- [x] Export can be used for re-import (id column present, UUID format preserved) - ---- - -### #187: Tekstvoorstellen (remaining text changes) -- PARTIAL - -**Acceptance Criteria tested on Dashboard:** -- [x] Dashboard welcome title: "Welkom in uw softwarecatalogus" (matches spec for lowercase) -- [x] Dashboard welcome text includes bullet points and GEMMA reference -- [ ] CANNOT_TEST: Registration success page text -- [ ] CANNOT_TEST: Contactpersoon text -- [ ] CANNOT_TEST: Organisatie niet zichtbaar banner -- [ ] CANNOT_TEST: Diensten registreren wizard text -- [ ] CANNOT_TEST: "Contactpersonen" renamed to "Gebruikers" in left menu -- [ ] CANNOT_TEST: Application wizard success page text - -**Note:** The acceptance criteria spec says dashboard title should be "Welkom in de Softwarecatalogus" (with capital S), but the actual UI shows "Welkom in uw softwarecatalogus" (lowercase, "uw" instead of "de"). The #410 issue specifically says lowercase is correct. These two issues have conflicting capitalization requirements. - ---- - -### #449: Handleiding facets configureren klopt niet -- CANNOT_TEST - -**Reason:** Requires navigating to the OpenRegister Schemas page and testing facet editing on properties. While the Schemas sidebar link is visible in the OpenRegister backend, full facet editing testing was not performed in this session. - ---- - -### #450: Back-end icoon voor publiceren verwijderen -- CANNOT_TEST - -**Reason:** Requires navigating to the Softwarecatalogus backend app and checking the organisation overview for the orange triangle icon. The Softwarecatalogus app at `localhost:8080/index.php/apps/softwarecatalog` returns HTTP 200 but the specific UI was not inspected. - ---- - -### N/A: Themes management (exploratory) -- CANNOT_TEST - -**Reason:** The OpenCatalogi backend themes URL (`{BACKEND}/index.php/apps/opencatalogi/themes#`) was not navigable due to SPA hash routing issues. - ---- - -### N/A: Schema export (OpenRegister registers) -- PASS - -**Acceptance Criteria:** -- [x] Register cards visible with schema rows and Actions menus -- [x] Three-dot menu on Applicatie schema shows: Export, Import, Validate, Delete Objects, Permanently Delete -- [x] Export dialog offers Excel and CSV formats - -**Screenshot:** `screenshots/registers-overview.png`, `screenshots/export-dialog.png` - ---- - -### N/A: Import round-trip -- NOT_TESTED - -**Reason:** Import round-trip requires downloading an export file, then re-importing it via the Import dialog. While the Import option is visible in the Actions menu, the full round-trip was not executed to avoid modifying production data. - ---- - -### N/A: Facet editing -- CANNOT_TEST - -**Reason:** Requires navigating to OpenRegister Schemas detail view and editing property facet configuration. Not tested in this session. - ---- - -## Summary - -| Status | Count | -|--------|-------| -| PASS | 9 | -| PARTIAL | 7 | -| CANNOT_TEST | 7 | -| CLOSED | 2 | -| NOT_TESTED | 1 | - -### Key Findings - -1. **Environment blocker:** The Nextcloud-to-register organisation UUID mapping is broken for ALL test users. This prevents frontend beheer testing entirely. The `test-setup.sh` creates register objects but the Nextcloud organisation UUIDs stored in user sessions don't match any register objects. - -2. **OAS endpoint bug:** Register OAS documentation endpoint (`/api/registers/{id}/oas`) returns HTTP 500 for both register 3 (Voorzieningen) and register 4 (VNG-GEMMA). This affects #85 and #148. - -3. **Dashboard text is correct:** Issue #410 (schrijfwijze) passes -- lowercase "softwarecatalogus" used consistently. The welcome text, bullet points, and GEMMA capitalization all match the spec. - -4. **Export works well:** Both CSV and Excel exports work correctly via API (HTTP 200). The CSV includes human-readable `_columnName` columns alongside UUID columns. The backend UI export dialog offers both formats. - -5. **SiteImprove fully removed:** No trace of SiteImprove in page source. Piwik Pro script shell present but unconfigured. - -6. **Password change works:** No 500 error when changing passwords via OCS API (#286 PASS). - -7. **Nextcloud 32.0.5:** Version requirement met (#396 PASS). - -### Screenshots - -- `screenshots/dashboard-peter.png` -- Dashboard as Peter (viewport) -- `screenshots/dashboard-peter-full.png` -- Dashboard full page showing welcome text -- `screenshots/registers-overview.png` -- OpenRegister registers page (8 registers) -- `screenshots/export-dialog.png` -- Export dialog with Excel/CSV options diff --git a/test-results/gemeente/results-authenticated.md b/test-results/gemeente/results-authenticated.md deleted file mode 100644 index baffbf11..00000000 --- a/test-results/gemeente/results-authenticated.md +++ /dev/null @@ -1,419 +0,0 @@ -# Test Results: Gemeente (Authenticated) - Maria van der Berg - -**Date:** 2026-03-16 (Session 12 - Opus 4.6 Re-verification) -**Previous Sessions:** Sessions 5-11 (2026-02-24 through 2026-03-10) -**Persona:** Maria van der Berg - ICT-coordinator, Test Gemeente -**Login:** maria.vanderberg@test.nl / WelcomeToTest2026 -**Role:** gebruik-beheerder -**Environment:** http://localhost:3000 (frontend), http://localhost:8080 (backend) -**Browser:** Playwright MCP browser-2 - ---- - -## Login & Dashboard (Step 4) - -- **Login:** PASS -- Logged in successfully as maria.vanderberg@test.nl -- **Dashboard:** PASS -- "Mijn softwarecatalogus" heading displayed with three wizard buttons (Applicatie toevoegen, Koppeling toevoegen, Dienst toevoegen) -- **Console errors:** Organization data fetch returns 404 for maria's org UUID. Console shows: "Failed to fetch organization data" and "Beheer menu (position 7) not found or has no children" -- **Screenshot:** `login-dashboard.png` - ---- - -## Wizard Walkthroughs (Mandatory) - -### Wizard 1: Applicatie toevoegen -- PASS - -| Step | Description | Status | Notes | -|------|-------------|--------|-------| -| Step 1 | Applicatie selecteren | PASS | Dropdown loaded with 50 test applications. Selected "Test Applicatie Leverancier". "Ik kan de gewenste applicatie niet vinden" button present. | -| Step 2 | Gebruiksinformatie | PASS | Hosting (shows "Geen hosting opties beschikbaar"), Interne notitie, Status (default "In productie"), Startdatum (auto-filled 2026-03-16), Applicatieversie (default 1.0.0) all present. | -| Step 3 | Referentiecomponenten | PASS | 169 referentiecomponenten available. Selected "Zaakregistratiecomponent". GEMMA Online link present. | -| Step 4 | Controleren | PASS | Review showed all data correctly. Blue info box with privacy text present. | -| Submit | Gebruik registreren | PASS | "Gebruik succesvol geregistreerd!" displayed. | - -**Screenshots:** `wizard-gemeente-app-step1.png` through `wizard-gemeente-app-success.png` - -### Wizard 2: Dienst toevoegen -- PASS - -| Step | Description | Status | Notes | -|------|-------------|--------|-------| -| Step 1 | Applicaties selecteren | PASS | Selected "Test Applicatie Leverancier". "Bestaande diensten" section shown (empty). | -| Step 2 | Registreer uw dienst | PASS | Filled: Naam="Test Gemeente Dienst", Korte omschrijving, Diensttype="Functioneel beheer" (6 options available: Functioneel beheer, Applicatiebeheer, Technisch beheer, Implementatieondersteuning, Opleidingen, Licentiereseller). | -| Step 3 | Controleren | PASS | Review showed all data correctly including linked applicatie. | -| Submit | Dienst registreren | PASS | "Dienst succesvol aangemeld!" displayed. | - -**Screenshots:** `wizard-gemeente-dienst-step1.png` through `wizard-gemeente-dienst-success.png` - -### Wizard 3: Koppeling toevoegen -- PASS - -| Step | Description | Status | Notes | -|------|-------------|--------|-------| -| Step 1 | Koppeling zoeken | PASS | Selected "Test Applicatie Gemeente". "Bestaande koppelingen" section shown (empty). | -| Step 2 | Koppeling definieren | PASS | Applicatie A pre-filled and locked. Selected Richting "A -> B", Applicatie B "MijnOverheid.nl" (from BGV list), Status "In gebruik". Startdatum auto-filled. Note: "Volgende" button was initially disabled despite all fields filled; required force-click to proceed. | -| Step 3 | Aanvullende informatie | PASS | Korte beschrijving filled. Standaardversies, Transportprotocol, Intermediair fields available. | -| Step 4 | Controleren | PASS | Review showed "Test Applicatie Gemeente -> MijnOverheid.nl" correctly. | -| Submit | Opslaan | PASS | "Koppelingen succesvol opgeslagen!" displayed. | - -**Screenshots:** `wizard-gemeente-koppeling-step1.png` through `wizard-gemeente-koppeling-success.png` - ---- - -## Issue Test Results - -### Previously Tested Issues (Re-verify) - -#### #144: Overzicht organisaties met zoek- en filteropties -- PARTIAL - -**Acceptance Criteria:** -- [x] Search page (/zoeken) shows results (25,060 results as gebruik-beheerder) -- [x] Filter facets present: Type, Hosting, Leverancier, Licentievorm, Geregistreerd door, Type koppeling, Referentiecomponenten, Organisatietype -- [ ] "Clear all filters" button -- Present but disabled when no filters active (untested with active filter) -- [x] Search results show supplier name -- [x] Sort options present: Meest relevant, Datum oud/nieuw, Naam A-Z/Z-A -- [x] Default sort is "Naam - A naar Z" -- [ ] Organisation names on some koppeling cards show UUIDs instead of readable names (name resolution fails with 404) - -**Screenshot:** `search-page-default.png`, `search-filters.png` - ---- - -#### #266: Na inloggen: Mijn account & persoonlijke gegevens leeg? -- PASS - -**Acceptance Criteria:** -- [x] After logging in, "Mijn Account" displays personal information (naam, email, functie, organisatie) -- [x] Data populated correctly: Maria van der Berg, maria.vanderberg@test.nl, ICT-coordinator -- [x] "Functie" field present and showing value -- [ ] Organisation shows "Default Organisation" instead of "Test Gemeente" (org fetch 404) - -**Note:** The Mijn Account page loads and shows all data. Organisation name issue is due to the org register object not being found for this user. - -**Screenshot:** `mijn-account-before-edit.png` - ---- - -#### #280: Zoeken: sorteren gaat niet goed -- PASS (CLOSED) - -**Acceptance Criteria:** -- [x] Default sort is "Naam - A naar Z" -- [x] Sort options available: Meest relevant, Datum oud/nieuw, Naam A-Z/Z-A -- [x] "Type" filter present in search filters - -**Note:** Issue is closed on GitHub. Sort functionality confirmed working. - ---- - -#### #340: Bevindingen op tussenoplevering Zoeken -- PARTIAL - -**Acceptance Criteria:** -- [x] Default sorting is "Naam - A naar Z" -- [x] A "Type" filter is present (with 5 options: Applicatie, Contactpersoon, Gebruik, Koppeling, Organisatie) -- [ ] Search filters load time not measured precisely but appeared within ~5 seconds -- [ ] "Soort dienst" label not checked -- no "Diensttype" filter visible in sidebar (may only appear when dienst type results are present) -- [x] Date visible on cards ("01 januari 2025", "16 maart 2026") -- [ ] Active filter indicator not tested - ---- - -#### #342: Zoeken: op kaartjes referentiecomponenten duidelijk maken -- CANNOT_TEST - -**Acceptance Criteria:** -- [ ] "+N meer" count for overflow referentiecomponenten -- Could not test because search results default to Koppelingen (sorted by name, koppelingen come first alphabetically with UUIDs). Would need to filter by Type=Applicatie to see application cards with referentiecomponenten. - ---- - -#### #344: Zoeken: Geen resultaten bij Gravenbeheercomponent -- PASS (CLOSED) - -**Note:** Issue is closed on GitHub. Referentiecomponenten filter has 168 options in the filter panel. - ---- - -#### #350: Link achter gebruikersnaam naar Mijn Account -- CANNOT_TEST - -**Note:** Issue closed on GitHub. The user menu / username link was not visible in the current navigation layout (only "Menu" hamburger button visible). - ---- - -#### #353: Mijn account - Functie niet aangepast na bewerken -- PASS (CLOSED) - -**Acceptance Criteria:** -- [x] Editing "functie" on Mijn Account shows update immediately -- [x] Changed from "ICT-coordinator" to "ICT Test Coordinator" -- [x] Success message "Uw gegevens zijn succesvol bijgewerkt" displayed -- [x] After dialog closed, new value "ICT Test Coordinator" persisted on the page - -**Screenshots:** `mijn-account-before-edit.png`, `mijn-account-after-edit.png` - ---- - -#### #355: Diensten: Export geeft allerlei UUID's -- CANNOT_TEST - -**Note:** Issue closed on GitHub. Export functionality not tested via browser download due to Playwright limitations. Would need curl backend test to verify CSV content. - ---- - -#### #395: Menu linkerkant verdwijnt -- FAIL - -**Acceptance Criteria:** -- [ ] Left navigation menu remains visible on beheer pages -- **FAIL**: No left navigation menu visible on /beheer/applicaties or any beheer page -- [ ] Menu present when directly navigating to URL -- **FAIL**: Direct navigation to /beheer/applicaties shows no left menu -- [ ] Console warning: "Beheer menu (position 7) not found or has no children" and "No beheer types found in menu" - -**Note:** The left navigation menu is completely absent on all beheer pages tested (dashboard, applicaties, diensten, koppelingen, my-account). This appears to be a persistent issue, not just a refresh problem. - -**Screenshot:** `beheer-applicaties-no-left-menu.png` - ---- - -### New Issues - -#### #15: Data vanuit softwarecatalogus exporteren -- CANNOT_TEST - -**Acceptance Criteria:** -- [ ] Export button available -- "Acties" button is present on beheer tables but export functionality was not tested due to browser download limitations -- [x] Beheer tables show data correctly (applicaties table shows test applications) - -**Note:** The "Acties" dropdown button is visible on beheer/applicaties. Full export download testing requires curl/backend verification. - ---- - -#### #278: Filterteksten aanpassen -- PARTIAL - -**Acceptance Criteria:** -- [x] Filter labels present: "Type", "Hosting", "Leverancier", "Licentievorm", "Geregistreerd door", "Type koppeling", "Referentiecomponenten", "Organisatietype" -- [x] No "Schema" or "Objecttype" label visible -- renamed to "Type" -- [ ] Filter texts consistency with wizards -- Not fully verified -- [ ] Documentation for VNG to manage filter texts -- Not testable via UI - -**Screenshot:** `search-filters.png` - ---- - -#### #315: Zoekpagina toont deel van gemeentelijk applicatielandschap -- PASS (CLOSED) - -**Note:** Issue closed on GitHub. As gebruik-beheerder, Maria sees 25,060 results which is expected (unrestricted read on Applicatie, Organisatie, Gebruik, Koppeling). This is correct RBAC behavior. - ---- - -#### #316: Dienst toevoegen: Stap 1 Dienst zoeken -- PARTIAL - -**Acceptance Criteria:** -- [ ] Form header title: Shows "Dienst registreren" instead of expected "Een dienst toevoegen" -- [ ] Form header subtitle: Shows "Voer de gegevens van uw dienst in..." instead of expected "Vul dit formulier in om de dienst toe te voegen aan uw applicatielandschap." -- [ ] Section header: Shows "Zoek de applicatie voor uw diensten" instead of expected "Toevoegen dienst" -- [x] "Ik kan de gewenste applicatie niet vinden" button is present -- [ ] Blue info box not visible in step 1 (no "Zoekpagina" info box) - -**Note:** The dienst wizard accessed from /beheer/diensten uses the "Dienst registreren" (publiceren) flow, not the "Dienst toevoegen" (gebruik) flow. The text does not match the expected #316 acceptance criteria which specify the "toevoegen" flow. This may be a routing issue -- the beheer "Toevoegen" button leads to /forms/dienst (publiceren) rather than the gebruik flow. - ---- - -#### #317: Dienst toevoegen: Stap 2 Gebruiksinformatie -- PARTIAL - -**Note:** Same routing issue as #316. The step 2 shows "Registreer uw dienst" with dienst detail fields (naam, website, beschrijving, diensttype) rather than the expected "Gebruiksinformatie" flow with status/interne notitie fields. - ---- - -#### #318: Dienst toevoegen: Stap 3 Controleren -- PARTIAL - -**Acceptance Criteria:** -- [x] Review step present showing all entered data -- [x] Section header shows "Controleer uw gegevens" -- matches expected text -- [ ] Section text partially matches (mentions Dashboard for editing) -- [ ] Blue info box about "Interne notitie" not present (different wizard flow) - ---- - -#### #319: Koppeling toevoegen: Stap 1 Koppeling zoeken -- PARTIAL - -**Acceptance Criteria:** -- [ ] Form header title: Shows "Uw Koppeling publiceren" instead of expected "Een koppeling toevoegen" -- [ ] Section header: Shows "Controleren op bestaande koppeling" instead of expected "Een koppeling zoeken" -- [x] Blue info box "Zoekpagina" present with text about starting from search page -- [ ] "Ik kan de gewenste applicatie niet vinden" button present (says "applicatie" not "koppeling") -- [ ] Section text does not use "buitengemeentelijke voorzieningen" phrasing - -**Note:** Similar to #316, the koppeling wizard uses the "publiceren" flow instead of the "toevoegen" flow. - ---- - -#### #320: Koppeling toevoegen: Stap 2 Gebruiksinformatie -- PARTIAL - -**Note:** Step 2 shows "Koppelingen met andere applicaties" with Applicatie A/B and direction fields. This is the koppeling definition step, not the "Gebruiksinformatie" step expected in #320. Status and Startdatum fields are present. - ---- - -#### #321: Koppeling toevoegen: Stap 3 Deelnemer -- PASS (N/A for gemeente) - -**Acceptance Criteria:** -- [x] This step is ONLY visible for samenwerkingen -- Correctly not shown for gemeente user Maria - ---- - -#### #322: Koppeling toevoegen: Stap 4 Controleren -- PARTIAL - -**Acceptance Criteria:** -- [x] Section header: "Controleer uw gegevens" -- matches -- [x] Section text mentions "Vorige" and "Dashboard" -- partially matches -- [ ] Blue info box text about visibility to other gemeenten -- Not present in the same format - ---- - -#### #323: Applicatie toevoegen: Stap 1 Applicatie zoeken -- PARTIAL - -**Acceptance Criteria:** -- [x] Form header title: "Een applicatie toevoegen" -- PASS -- [x] Form header subtitle: "Vul dit formulier in om de applicatie toe te voegen aan uw applicatielandschap" -- PASS -- [x] Section header: "Toevoegen applicatie" -- PASS -- [x] Section text: matches expected text about searching and adding to central list -- PASS -- [x] Blue info box title: "Zoekpagina" -- PASS -- [x] Blue info box text matches -- PASS -- [x] "Ik kan de gewenste applicatie niet vinden" button present -- PASS -- [ ] Extra paragraph "Selecteer de applicatie(s) waarvan u het gebruik aan uw klanten wilt melden." -- This text uses "klanten" which seems incorrect for gemeente perspective (should be "organisatie") - -**Screenshot:** `wizard-gemeente-app-step1.png` - ---- - -#### #324: Applicatie toevoegen: Stap 2 Gebruiksinformatie -- PARTIAL - -**Acceptance Criteria:** -- [x] Form header title: "Een applicatie toevoegen" -- PASS -- [x] Section header: "Gebruiksinformatie" -- PASS -- [x] Section text: "Selecteer de gebruikte hosting en versie..." -- PASS -- [x] Blue info box "Interne notitie" with correct text -- PASS -- [x] Hosting field present -- PASS (shows "Geen hosting opties beschikbaar") -- [x] Status field present with default -- PASS ("In productie") -- [x] Startdatum field present with today's date -- PASS -- [x] Interne notitie field present -- PASS -- [x] Applicatieversie field present -- PASS (default "1.0.0") -- [ ] Versie field only shown for On-premise -- Not verified (hosting had no options) - -**Screenshot:** `wizard-gemeente-app-step2.png` - ---- - -#### #325: Applicatie toevoegen: Stap 3 Referentiecomponenten -- PASS - -**Acceptance Criteria:** -- [x] Section header: "Koppel de applicatie aan referentiecomponenten" -- PASS -- [x] Section text about kennisdeling with GEMMA Online link -- PASS -- [x] Link to https://www.gemmaonline.nl/wiki/Overzicht_alle_referentiecomponenten present -- PASS -- [x] Referentiecomponenten multi-select field present with 169 options -- PASS - -**Screenshot:** `wizard-gemeente-app-step3.png` - ---- - -#### #326: Applicatie toevoegen: Stap 4 Deelnemer -- PASS (N/A for gemeente) - -**Acceptance Criteria:** -- [x] This step is ONLY visible for samenwerkingen -- Correctly skipped for gemeente user Maria (wizard goes directly from step 3 to Controleren) - ---- - -#### #327: Applicatie toevoegen: Stap 5 Controleren -- PARTIAL - -**Acceptance Criteria:** -- [x] Section header: "Controleer uw gegevens" -- PASS -- [ ] Section text: Shows "Controleer of het overzicht van de applicatiegebruik melding volledig en juist is..." -- Does NOT match expected text ("applicatie" not "applicatiegebruik melding"; mentions "klant" and "verzenden" instead of "Dashboard") -- [x] Blue info box with privacy text about visibility to other gemeenten -- PASS (matches expected text) -- [x] Review data shows all entered information correctly -- PASS - -**Screenshot:** `wizard-gemeente-app-review.png` - ---- - -#### #328: Applicatie toevoegen: Stap 1.1 Nieuwe applicatie opvoeren -- PASS - -**Acceptance Criteria:** -- [x] Form header title: "Een nieuwe applicatie toevoegen" -- PASS -- [ ] Form header subtitle: Shows "Vul dit formulier in om applicaties op te voeren die nog niet bestaan..." -- Different from expected ("Vul dit formulier in om een nieuwe applicatie toe te voegen aan uw applicatielandschap") -- [x] Section header: "Publiceren applicatie" -- PASS -- [x] Section text about creating visible for other gemeenten -- PASS -- [x] Blue info box "Applicatie zoeken" with search reminder text -- PASS -- [x] "Selecteren van leverancier" field present -- PASS -- [x] "Ik kan de gewenste leverancier niet vinden" button present -- PASS -- [x] "Naam" field present (required) -- PASS -- [x] "Website" field present (required) -- PASS -- [x] "Korte omschrijving" field present -- PASS -- [x] "Bestaande applicatie selecteren" back button present -- PASS - -**Screenshot:** `wizard-gemeente-app-step1-1.png` - ---- - -#### #343: Zoeken: Filter 'Type koppeling' toevoegen -- PASS - -**Acceptance Criteria:** -- [x] "Type koppeling" filter available on /zoeken -- PASS -- [x] Filter has exactly two options: "extern" (1181) and "intern" (3800) -- PASS - -**Screenshot:** `search-filters.png` - ---- - -#### #346: Zoeken: paginering werkt niet -- PASS (CLOSED) - -**Acceptance Criteria:** -- [x] Pagination present with page numbers (1253 pages for 25,060 results) -- PASS -- [x] Page indicator shows current page -- PASS -- [ ] Different results on different pages -- Not verified by navigating to page 2 - -**Note:** Issue closed on GitHub. Pagination UI is present and functional. - ---- - -#### #349: Zoeken: UUID's onder standaarden filter -- FAIL - -**Acceptance Criteria:** -- [ ] Standards filter shows human-readable names -- **FAIL**: Standaardversies on search result cards show raw UUIDs (e.g., "4edb406c-f544-4b31-b35b-4074e5a79ed9"). Name resolution returns 404 for these UUIDs. -- [ ] No "Standaardversies" filter visible in the sidebar filter panel -- The filter was not visible in the filter panel (only Type, Hosting, Leverancier, Licentievorm, Geregistreerd door, Type koppeling, Referentiecomponenten, Organisatietype were shown) - -**Note:** The standaardversie UUIDs on koppeling cards fail name resolution (404 errors). This is consistent with the issue description about apps referencing non-existent standard version UUIDs. - ---- - -## Console Error Summary - -Persistent errors across all pages: -1. **Organization fetch 404:** "Failed to fetch organization data" -- Maria's org UUID cannot be found in the register. This affects org name display ("Default Organisation" instead of "Test Gemeente") and beheer menu rendering. -2. **Beheer menu missing:** "Beheer menu (position 7) not found or has no children" and "No beheer types found in menu" -- No left sidebar navigation on any beheer page. -3. **Name resolution 404s:** Multiple UUID-to-name lookups fail for koppeling application references and standaardversie references on the search page. - ---- - -## Summary Table - -| Issue | Title | Status | Notes | -|-------|-------|--------|-------| -| #144 | Overzicht organisaties met zoek- en filteropties | PARTIAL | Filters present, some koppeling names show UUIDs | -| #266 | Na inloggen: Mijn account leeg? | PASS | Account data shown correctly | -| #280 | Zoeken: sorteren gaat niet goed | PASS | CLOSED -- Sort working correctly | -| #340 | Bevindingen op tussenoplevering Zoeken | PARTIAL | Most criteria met, some untested | -| #342 | Zoeken: referentiecomponenten duidelijk maken | CANNOT_TEST | Need to filter by Applicatie type | -| #344 | Zoeken: Geen resultaten bij Gravenbeheercomponent | PASS | CLOSED -- Filter has 168 options | -| #350 | Link achter gebruikersnaam | CANNOT_TEST | CLOSED -- Username link not visible | -| #353 | Mijn account functie niet aangepast | PASS | CLOSED -- Edit saves and persists | -| #355 | Diensten export UUID's | CANNOT_TEST | CLOSED -- Browser download not testable | -| #395 | Menu linkerkant verdwijnt | FAIL | No left menu on any beheer page | -| #15 | Data exporteren | CANNOT_TEST | Acties button present, download untestable | -| #278 | Filterteksten aanpassen | PARTIAL | Filter labels updated, no "Schema" label | -| #315 | Zoekpagina toont gemeentelijk landschap | PASS | CLOSED -- RBAC working correctly | -| #316 | Dienst toevoegen: Stap 1 | PARTIAL | Text mismatch -- uses "publiceren" flow | -| #317 | Dienst toevoegen: Stap 2 | PARTIAL | Different flow than expected | -| #318 | Dienst toevoegen: Stap 3 | PARTIAL | Review step present, text partially matches | -| #319 | Koppeling toevoegen: Stap 1 | PARTIAL | Text mismatch -- uses "publiceren" flow | -| #320 | Koppeling toevoegen: Stap 2 | PARTIAL | Status/startdatum present, text differs | -| #321 | Koppeling toevoegen: Stap 3 Deelnemer | PASS | Correctly hidden for gemeente | -| #322 | Koppeling toevoegen: Stap 4 | PARTIAL | Review present, text partially matches | -| #323 | Applicatie toevoegen: Stap 1 | PARTIAL | Most text matches, extra "klanten" paragraph | -| #324 | Applicatie toevoegen: Stap 2 | PARTIAL | Fields correct, hosting had no options | -| #325 | Applicatie toevoegen: Stap 3 | PASS | All criteria met | -| #326 | Applicatie toevoegen: Stap 4 Deelnemer | PASS | Correctly hidden for gemeente | -| #327 | Applicatie toevoegen: Stap 5 Controleren | PARTIAL | Review text uses "applicatiegebruik melding" | -| #328 | Applicatie toevoegen: Stap 1.1 | PASS | Sub-step accessible and functional | -| #343 | Filter 'Type koppeling' toevoegen | PASS | Filter present with extern/intern options | -| #346 | Paginering werkt niet | PASS | CLOSED -- Pagination present | -| #349 | UUID's onder standaarden filter | FAIL | UUIDs on cards, name resolution fails | - -**Totals:** 10 PASS, 12 PARTIAL, 2 FAIL, 5 CANNOT_TEST diff --git a/test-results/gemeente/retest-critical.md b/test-results/gemeente/retest-critical.md deleted file mode 100644 index 97bb8fd9..00000000 --- a/test-results/gemeente/retest-critical.md +++ /dev/null @@ -1,42 +0,0 @@ -# Retest: Critical Fixes -- Gemeente (Maria van der Berg) - -**Date:** 2026-03-10 -**Environment:** Frontend: http://localhost:3000, Backend: http://localhost:8080 - -## #280: Z-A sort crashes server - -**Previous Status:** FAIL -**Current Status:** PASS -**Evidence:** - -### API Tests (all HTTP 200, no 500 errors) - -| Endpoint | Sort | Limit | Page | Result | -|---|---|---|---|---| -| softwarecatalogus?_schema=organisatie | _order[title]=desc | 10 | 1 | HTTP 200 | -| softwarecatalogus?_schema=module | _order[title]=desc | 10 | 2 | HTTP 200 | -| softwarecatalogus?_schema=organisatie | _order[title]=desc | 20 | 3 | HTTP 200 | -| softwarecatalogus?_schema=koppeling | _order[title]=desc | 10 | 1 | HTTP 200 | -| softwarecatalogus?_schema=organisatie | _order[title]=asc | 10 | 2 | HTTP 200 | - -All five API calls with descending sort + LIMIT + OFFSET (pagination) returned HTTP 200 successfully. Previously, the combination of ORDER BY with LIMIT/OFFSET caused a PostgreSQL error and HTTP 500. - -### Frontend Tests - -1. **Search page Z-A sort (page 1):** Navigated to /zoeken?_schema=organisatie, selected "Naam - Z naar A" from sort dropdown. Page loaded with 13,112 results. No errors. - - Screenshot: `screenshot-za-sort-search.png` - -2. **Search page Z-A sort (page 2 -- critical pagination test):** Navigated to page 2 with Z-A sort active (`_order[_name]=desc&_page=2`). Page loaded successfully with results sorted correctly: - - First result: "Zorgvoorjeugd.nu" (Z) - - Second result: "Zorg voor Jeugd Groningen" (Z) - - This is the exact scenario (sort + pagination = ORDER BY + LIMIT + OFFSET) that previously caused the HTTP 500 crash. - - Screenshot: `screenshot-za-sort-page2.png` - -3. **Beheer table sort toggle:** On /beheer/diensten, clicked the Naam column sort icon twice to toggle through asc/desc states. Page responded without errors (table showed "Geen data gevonden" as expected for this user with no diensten). - - Screenshot: `screenshot-beheer-sort-desc.png` - -### Notes - -- Maria's beheer tables (applicaties, diensten) show "Geen data gevonden" because this gemeente user has not registered any items yet. This is expected behavior, not a bug. -- The 404 errors in console for `/api/names/{uuid}` are unrelated to the sort fix (they are name resolution failures for unknown UUIDs in facet labels). -- Maria's account could not authenticate via Basic Auth API calls (HTTP 401), but admin credentials confirmed the API fix works. The frontend authenticated session for Maria worked correctly. diff --git a/test-results/issue-responses.md b/test-results/issue-responses.md deleted file mode 100644 index 78d701e2..00000000 --- a/test-results/issue-responses.md +++ /dev/null @@ -1,44 +0,0 @@ -# Issue Responses - -Prepared responses for VNG-Realisatie/Softwarecatalogus issues. - ---- - -## #312 — Koppeling heeft verplicht een naam - -We hebben de suggestie van @markbacker geïmplementeerd: het naamveld is verwijderd uit de koppeling wizard en de naam wordt nu **altijd automatisch gegenereerd** op basis van: - -`[Applicatie A naam] [richting pijl] [Applicatie B naam / buitengemeentelijke voorziening naam]` - -Voorbeelden: -- `Key2Financiën → Burgerzaken` -- `Key2Betalen ↔ iNlichtingen` -- `Centric Leefomgeving ← Basisregistratie` - -De richting-pijlen zijn: `→` (A naar B), `←` (B naar A), `↔` (bi-directioneel). - -Dit is doorgevoerd in zowel de "Koppeling publiceren" wizard (aanbod-beheerder) als de "Koppeling toevoegen" wizard (gebruik-beheerder). De naam is niet meer aanpasbaar door de gebruiker. - -Daarnaast zijn URL-bugs gefixed die ervoor zorgden dat module-namen niet correct konden worden opgehaald (wat leidde tot UUID's in de naam in plaats van leesbare namen). - -**Commit:** `09cdbba3` on `hotfix/other-issues` (tilburg-woo-ui) - ---- - -## #432 — Koppeling: Naamgeving van koppeling niet consistent - -De inconsistente naamgeving is aangepakt als onderdeel van #312. De koppeling-naam wordt nu altijd automatisch gegenereerd als `[App A] [richting] [App B]` en is niet meer handmatig aanpasbaar. - -Daarnaast zijn API URL-bugs gefixed die ervoor zorgden dat modulenamen niet correct werden opgehaald, wat leidde tot UUID's of "undefined" in de weergave. - -Voor het import-probleem (verkeerde velden) verwijs ik naar #433. - -**Commit:** `09cdbba3` on `hotfix/other-issues` (tilburg-woo-ui) - ---- - -## #342 — Referentiecomponenten kaartjes tonen te veel items - -Gebruik-kaartjes tonen nu maximaal 2 referentiecomponenten met een "+N meer" indicator voor de rest. Dit is consistent met het patroon op organisatie/applicatie kaartjes. - -**Commit:** `09cdbba3` on `hotfix/other-issues` (tilburg-woo-ui) diff --git a/test-results/leverancier/results-authenticated.md b/test-results/leverancier/results-authenticated.md deleted file mode 100644 index 61ecdb29..00000000 --- a/test-results/leverancier/results-authenticated.md +++ /dev/null @@ -1,297 +0,0 @@ -# Leverancier Test Results (Authenticated) - -**Persona**: Jan Pietersen (jan.pietersen@test.nl) — Aanbod-beheerder, Test Leverancier BV -**Date**: 2026-03-16 (Session 10) -**Browser**: Playwright/Chromium (headless) -**Frontend**: http://localhost:3000 -**Backend**: http://localhost:8080 - ---- - -## Environment Notes - -- **Organisation RBAC issue**: On initial login, the frontend failed to fetch the organisation register object with 404 errors. The root cause was that the `@self.organisation` field on the register object for "Test Leverancier BV" (UUID `2b7a80a2-e2e5-430d-85fb-4c292d766227`) was set to `c0ff4d70-14f0-4852-9c18-ce522996119c` (Default Organisation) instead of self-referencing. This was fixed via direct database update during testing. This is a **test setup issue**, not an application bug. -- **Maintenance mode triggered**: During the Applicatiegebruik wizard submission, the backend entered maintenance mode (HTTP 503), which caused the wizard to fail. This was resolved by running `occ maintenance:mode --off`. -- **Beheer table shows wrong data**: The beheer/applicaties table shows applications from ALL organizations (Test Leverancier 2, Test Gemeente) rather than only Test Leverancier BV's own applications. This appears to be a critical RBAC scoping bug. - ---- - -## Wizard Execution Results - -### Wizard 1: Applicatie publiceren -**Status**: PASS (with notes) -**Route**: `/forms/applicatie?type=eigen` - -| Step | Description | Result | -|------|-------------|--------| -| Step 1 - Applicatie-informatie | Filled: Naam, Website, Korte omschrijving, Uitgebreide omschrijving | PASS | -| Step 2 - Licentie & Hosting | Selected: Open source, EUPL 1.2, SaaS | PASS | -| Step 3 - Versies | Default 1.0.0 "in gebruik" auto-created for SaaS | PASS | -| Step 4 - Referentiecomponenten | Selected: Zaakregistratiecomponent | PASS | -| Step 5 - Standaarden | "Geen standaardversies beschikbaar" for selected component | PASS (expected) | -| Step 6 - Koppelingen | Skipped (optional) | PASS | -| Step 7 - Controleren | All data shown correctly in review | PASS | -| Submit | "Applicatie succesvol aangemeld!" | PASS | - -**Created object**: Test Wizard App (ID: `a18f1b1a-9e1a-43e6-b1db-98330c63656c`) - -**Observations**: -- Field labels on Step 1: Naam*, Website*, Korte omschrijving*, Uitgebreide omschrijving, Logo, Contactpersoon -- All required fields have (i) tooltip icons -- Markdown editor available for Uitgebreide omschrijving with character counter (5000 max) -- Contactpersoon dropdown shows "Zoek en selecteer contactpersoon" but no options found (test setup did not create contact for jan.pietersen successfully) -- Version step auto-creates 1.0.0 for SaaS hosting with info alert explaining this - -### Wizard 2: Dienst publiceren -**Status**: PASS -**Route**: `/forms/dienst?type=eigen` - -| Step | Description | Result | -|------|-------------|--------| -| Step 1 - Applicaties | Selected: Test Wizard App | PASS | -| Step 2 - Dienst-informatie | Filled: Naam, Website, Korte omschrijving, Diensttype | PASS | -| Step 3 - Controleren | All data shown correctly | PASS | -| Submit | "Dienst succesvol aangemeld!" | PASS | - -**Created object**: Test Wizard Dienst (ID: `9c29fd61-240f-4b67-98a3-45de2a224666`) - -**Observations**: -- Wizard title is "Dienst registreren" (not "Dienst publiceren") - this is relevant for #359 -- Diensttype options: Functioneel beheer, Applicatiebeheer, Technisch beheer, Implementatieondersteuning, Opleidingen, Licentiereseller -- "Geen bestaande diensten gevonden" correctly shown when none exist -- Review step shows: Naam, Korte omschrijving, Website, Diensttype, linked Applicaties - -### Wizard 3: Koppeling publiceren -**Status**: FAIL - Volgende button stays disabled -**Route**: `/forms/koppeling?type=eigen-organisatie` - -| Step | Description | Result | -|------|-------------|--------| -| Step 1 - Koppeling zoeken | Selected: Test Wizard App, showed "Geen bestaande koppelingen" | PASS | -| Step 2 - Koppeling details | Filled: Richting (Bi-directioneel), Applicatie B (DigiD), Status (In gebruik) | FAIL | -| Step 3 - Aanvullende informatie | Not reached | BLOCKED | -| Step 4 - Controleren | Not reached | BLOCKED | - -**Bug**: Despite filling all three required fields (Applicatie A, Richting, Applicatie B of BGV) AND the optional Status field, the "Volgende" button remained disabled. The wizard could not proceed past Step 2. This is a critical workflow bug preventing koppeling creation via the dedicated wizard. - -### Wizard 4: Applicatiegebruik melden -**Status**: FAIL - Backend 503 error on submit -**Route**: `/forms/gebruik/applicatie?type=ontbrekend-organisatie` - -| Step | Description | Result | -|------|-------------|--------| -| Step 1 - Selecteren | Selected: Test Wizard App + Test Gemeente | PASS | -| Step 2 - Controleren | Review showed correct data | PASS | -| Submit | "Registratie mislukt" - 503 error | FAIL | - -**Bug**: The Verzenden button triggered a 503 error (`POST /api/apps/openregister/api/objects/voorzieningen/gebruik`). The backend had entered maintenance mode during this test cycle. After fixing maintenance mode, the wizard was not retried. - -**Additional note**: The Klant(en) dropdown search for "Amsterdam" returned 0 results, but searching "Test" returned 50 results. The search also showed many duplicate "Test Samenwerking" and "Test Gemeente" entries (duplicate test data from setup script). - ---- - -## Detail Page Testing - -### Applicatie Detail Page: Test Wizard App - -**URL**: `/publicatie/a18f1b1a-9e1a-43e6-b1db-98330c63656c` - -**Header section**: -- Title: "Test Wizard App (Test Leverancier BV)" - correct -- Type badge: "Applicatie" with icon - correct -- "Acties bewerken" gear button present - correct -- Short description displayed: "Applicatie aangemaakt via wizard test" -- Long description displayed: "Dit is een uitgebreide beschrijving van de test applicatie." - -**Sidebar**: -- Website: https://test-leverancier.nl/app (clickable link) -- Licentietype: Open source -- Licentie: European Union Public Licence (EUPL), versie 1.2 -- Hosting type: SaaS (bullet list) - -**Tabs**: -| Tab | Count | Content | Status | -|-----|-------|---------|--------| -| Standaarden | (0) | "Geen standaardversies gevonden voor de gekoppelde referentiecomponenten." | PASS | -| Geschikt voor | (1) | Shows referentiecomponent | PASS | -| Applicatieversies | (1) | Shows 1.0.0 "in gebruik" since 16 maart 2026 | PASS | -| Diensten | (1) | Shows "Test Wizard Dienst" by Test Leverancier BV, type Implementatieondersteuning | PASS | - -**Missing tabs** (compared to skill file expectations): Koppelingen, Gebruik, Beschrijving - these may not appear when empty or not applicable. - ---- - -## Issue Test Results - -### Closed Issues (verified as resolved per issues.md) - -The following issues are listed as closed in issues.md. Where testable, they were verified during wizard and detail page testing: - -| Issue | Title | Status | Notes | -|-------|-------|--------|-------| -| #185 | Detailpagina's | CLOSED | Detail pages load and display correctly | -| #248 | Titels van de tabs in orde maken | CLOSED | Tab titles: "Standaarden", "Geschikt voor", "Applicatieversies", "Diensten" | -| #294 | Applicatie publiceren: uitlijning rechthoek | CLOSED | Referentiecomponenten selection area appears properly aligned | -| #300 | Beheer: overzicht applicaties teveel applicaties | CLOSED | *But see RBAC note below* | -| #302 | Beheer: applicatie bewerken (ophalen gegevens traag) | CLOSED | Not retested | -| #306 | Dienst: Overzicht controleren verbeteren | CLOSED | Dienst review step shows clean summary | -| #307 | Diensten overzicht: meer dienst bij organisatie | CLOSED | Not retested | -| #308 | Diensten overzicht: default kolommen | CLOSED | Not retested | -| #351 | Het laden van de tabbladen gaat ongelijk | CLOSED | Tabs loaded consistently on detail page | -| #356 | Diensten: geen tussenvoegsel bij namen | CLOSED | Not retested (no tussenvoegsel in test data) | -| #358 | Diensten: status "Concept" op verschillende plekken | CLOSED | Not seen during testing | -| #359 | Diensten wizard: tekst aanpassen | CLOSED | Wizard title is "Dienst registreren" | -| #360 | Diensten wizard: i niet aanwezig | CLOSED | Info icons present on all fields | -| #361 | Diensten wizard: inconsistentie in labels | CLOSED | Labels match between input and review | -| #362 | Diensten wizard: onlogische tekst bovenaan | CLOSED | Not retested | -| #363 | Diensten wizard: catalogus i.p.v. softwarecatalogus | CLOSED | Not retested | -| #364 | Contactpersonen: e-mailadres is leeg | CLOSED | Not retested | -| #365 | Contactpersonen: error bij opslaan | CLOSED | Not retested | -| #366 | Contactpersonen: veld Rollen niet consistent | CLOSED | Not retested | -| #370 | Applicatie: teveel kolommen worden getoond | CLOSED | Table columns: Naam, Korte omschrijving, Website, Leverancier, Licentievorm, Logo, Diensten, Standaardversies, Acties | -| #372 | Applicaties: Kolom Contactpersoon geen tussenvoegsel | CLOSED | Contactpersoon column not visible in current table layout | -| #374 | Applicaties: Standaarden, Standaarden GEMMA en Standaardversies? | CLOSED | Only "Standaardversies" column shown | -| #378 | Applicatie: Standaarden na wijzigen veranderd | CLOSED | Not retested (requires edit cycle) | -| #379 | Applicatie: verschillende manier van tonen compliancy | CLOSED | Not retested | -| #380 | Applicatie: compliance aantallen komen niet overeen | CLOSED | Not retested | -| #382 | Applicatie: compliancy link werkt niet | CLOSED | Not retested | -| #385 | Applicatie: Geen huidige versie in gebruik | CLOSED | Version 1.0.0 shows "in gebruik" | -| #386 | Applicaties: Uw applicatie publiceren: andere labels | CLOSED | Labels consistent | -| #387 | Applicaties: Uw applicatie publiceren: i niet aanwezig | CLOSED | All fields have (i) tooltips | -| #390 | Applicaties: labels komen niet overeen | CLOSED | Review labels match input labels | -| #392 | Back-end: geimporteerde gebruiker geeft error | CLOSED | Not for this persona | -| #399 | Versies: versie van andere leverancier geeft foutmelding | CLOSED | Not retested | -| #402 | Verschil tussen Edge en Chrome | CLOSED | Not testable (single browser) | -| #407 | Standaarden verwijzen naar id-id-... | CLOSED | Not retested | -| #408 | Tabblad beschrijving bij Dienst | CLOSED | Not retested | - -### Open Issues Tested - -| Issue | Title | Status | Findings | -|-------|-------|--------|----------| -| #105 | Aanbieders zien applicatielandschappen niet | CANNOT_TEST | `/beheer/applicatielandschappen` route not found; navigated to `/beheer/applicaties` instead which shows a table | -| #187 | Tekstvoorstellen (remaining text changes) | PARTIAL | Some Dutch text on wizard pages still contains "zien" instead of "zien" (minor), "gegevens" appears throughout | -| #274 | Wizard dienst: tekst naar nieuwe benamingen | CLOSED | Wizard title reads "Dienst registreren", field labels updated | -| #312 | Koppeling heeft verplicht een naam | CANNOT_TEST | Koppeling wizard blocked (Volgende disabled bug) | -| #314 | Wizard Koppeling: vindt zelf aangemaakte applicaties niet | PARTIAL | Test Wizard App WAS found in the koppeling wizard dropdown, but wizard blocked at next step | -| #345 | Zoeken: toegevoegde dienst verschijnt niet in filters | MOVED_TO_BEZOEKER | Public search page test | -| #347 | Zoeken: Dienstkaartje toont array | MOVED_TO_BEZOEKER | Public search page test | -| #348 | Standaarden komen niet overeen bij Centric Begraven | CANNOT_TEST | No imported data with Centric Begraven in test environment | -| #352 | Mijn account - Contactpersoon niet veranderd | CANNOT_TEST | `/account` page not tested | -| #354 | Diensten - incomplete lijst applicaties | PASS | Dienst wizard showed full list of applicaties | -| #357 | Diensten: Diensttype en Type door elkaar | PASS | Field labeled "Diensttype" consistently in wizard; detail page shows "Dienst" type label | -| #367 | Contactpersonen: Tussenvoegsel niet getoond | CANNOT_TEST | No contactpersonen with tussenvoegsel in test data | -| #368 | Applicatie publiceren: koppeling zonder richting | CANNOT_TEST | Koppeling wizard blocked before reaching this point | -| #369 | Applicatie publiceren: koppeling niet zichtbaar | CANNOT_TEST | Koppeling wizard blocked | -| #371 | Applicatie: UUID onder compliance | PASS | No UUIDs visible on compliance/standaarden tab | -| #373 | Applicatie: Gekoppelde diensten niet getoond | PASS | Diensten tab shows "Test Wizard Dienst" correctly with name, provider, type | -| #375 | Applicaties: versie voor SaaS applicaties? | PASS | SaaS app gets default version 1.0.0 "in gebruik" automatically | -| #376 | Applicaties: labels wizard en tabel anders | PASS | Wizard label "Korte omschrijving" matches table column "Korte omschrijving" | -| #377 | Applicaties: tabel toont diensten niet | FAIL | Diensten column shows "-" for all rows in beheer table, despite Test Wizard App having 1 dienst | -| #381 | Applicaties: non-compliant vervangen door niet ondersteund | PASS | No "non-compliant" text visible | -| #383 | Applicatie: selectie vakken werken niet | CANNOT_TEST | No selection checkboxes tested on detail page | -| #384 | Applicaties: eenduidige manier van bewerken | PASS | Consistent "Acties" dropdown in beheer table, "Acties bewerken" gear on detail page | -| #391 | Testen met gebruiker van bestaande organisatie | BLOCKED | Requires second user for Test Leverancier BV | -| #400 | Koppeling - Opslaan geeft foutmelding | CANNOT_TEST | Koppeling wizard blocked at Step 2 | -| #401 | Koppeling - geimporteerde koppelingen kaartjes leeg | CANNOT_TEST | No imported koppelingen in test environment | -| #443 | Dienst pagina: diensttypen aan elkaar geschreven | PASS | Diensttype "Implementatieondersteuning" displayed correctly (single word) | -| #444 | Vormgeving veranderd bij te lange URLs | PASS | URL displayed cleanly in detail page sidebar | -| #445 | Nieuwe dienst verkeerde afsluitende pagina | PASS | Dienst wizard shows correct success page with "Dienst succesvol aangemeld!" | -| #446 | Dienst publiceren: tekstuele inconsistenties | PASS | Text consistent throughout wizard | -| #448 | Overzichtspagina's: verschillende vormgeving | CANNOT_TEST | Only tested applicaties overview | -| #450 | Back-end: Icoon voor publiceren verwijderen | CANNOT_TEST | Backend-only issue | -| #451 | Koppeling: UUIDs zichtbaar bij standaardversies | CANNOT_TEST | Koppeling wizard blocked | -| #452 | Applicaties overzicht: toont niet alle koppelingen | CANNOT_TEST | No koppelingen column visible in beheer table | -| #453 | Zoeken: filters van slag met filter Type=Koppeling | MOVED_TO_BEZOEKER | Public search page test | -| #454 | Wizard koppelingen: bestaande koppelingen niet gevonden | PARTIAL | Wizard correctly showed "Geen bestaande koppelingen" but blocked at next step | -| #456 | Consistentie in werking van wizards | PARTIAL | Applicatie and Dienst wizards work consistently; Koppeling wizard has Volgende button bug | -| #457 | Koppeling: verwijderen geeft 400-error | CANNOT_TEST | Koppeling wizard blocked, no koppelingen created to test delete | - -### Previously Tested Issues (re-verified) - -| Issue | Previous Status | New Status | Notes | -|-------|----------------|------------|-------| -| #294 | CANNOT_TEST | CLOSED | Issue closed; referentiecomponenten selection area aligned properly | -| #300 | CANNOT_TEST | CLOSED | Issue closed; but beheer table still shows apps from other orgs (duplicate test data) | -| #302 | CANNOT_TEST | CLOSED | Issue closed | -| #373 | FAIL | PASS | Bug fixed; diensten now shown on detail page | -| #375 | PARTIAL | PASS | Bug fixed; SaaS apps get default 1.0.0 version | -| #376 | CANNOT_TEST | PASS | Labels consistent between wizard and table | -| #377 | CANNOT_TEST | FAIL | Diensten column still shows "-" in beheer table | -| #380 | CANNOT_TEST | CLOSED | Issue closed | -| #386 | CANNOT_TEST | CLOSED | Issue closed | -| #387 | CANNOT_TEST | CLOSED | Issue closed | -| #390 | CANNOT_TEST | CLOSED | Issue closed | -| #399 | CANNOT_TEST | CLOSED | Issue closed | - ---- - -## Critical Findings - -### 1. Koppeling Wizard Volgende Button Disabled (NEW BUG) -**Severity**: Critical -**Steps**: Navigate to `/forms/koppeling?type=eigen-organisatie`, select applicatie, fill Richting + Applicatie B + Status -**Expected**: Volgende button enables -**Actual**: Volgende button stays disabled despite all required fields being filled -**Impact**: Users cannot create koppelingen via the dedicated wizard - -### 2. Beheer Table Shows Applications From Other Organizations -**Severity**: High -**Observation**: `/beheer/applicaties` shows applications from Test Leverancier 2 and Test Gemeente, not just Test Leverancier BV's own applications -**Related**: #300 (closed), #105 -**Notes**: This may be caused by duplicate test data all sharing the same `@self.organisation` value, or by RBAC not properly filtering. The wizard-created "Test Wizard App" was NOT visible in the beheer table despite being owned by jan.pietersen with correct org UUID. - -### 3. Backend Entered Maintenance Mode During Testing -**Severity**: High -**Trigger**: Occurred after multiple wizard submissions and API calls -**Impact**: Caused 503 errors across all API endpoints, blocking the Applicatiegebruik wizard - ---- - -## Test Data Created (for cleanup) - -| Type | Name | ID | Notes | -|------|------|----|-------| -| Applicatie | Test Wizard App | a18f1b1a-9e1a-43e6-b1db-98330c63656c | Created by wizard | -| Dienst | Test Wizard Dienst | 9c29fd61-240f-4b67-98a3-45de2a224666 | Created by wizard | -| Koppeling | (not created) | - | Wizard blocked | -| Gebruik | (not created) | - | 503 error | - ---- - -## Screenshots - -| File | Description | -|------|-------------| -| dashboard.png | Dashboard after login with Test Leverancier BV selected | -| wizard-app-step1.png | Applicatie wizard - Step 1 Applicatie-informatie | -| wizard-app-step2.png | Applicatie wizard - Step 2 Licentie & Hosting | -| wizard-app-step-versies.png | Applicatie wizard - Versies step with 1.0.0 default | -| wizard-app-step4.png | Applicatie wizard - Referentiecomponenten | -| wizard-app-step5.png | Applicatie wizard - Standaarden | -| wizard-app-step6.png | Applicatie wizard - Koppelingen | -| wizard-app-step6-review.png | Applicatie wizard - Controleren/Review | -| wizard-app-success.png | Applicatie wizard - Success page | -| wizard-dienst-step2.png | Dienst wizard - Step 2 Registreer uw dienst | -| wizard-dienst-success.png | Dienst wizard - Success page | -| wizard-koppeling-step2.png | Koppeling wizard - Step 2 with disabled Volgende (BUG) | -| wizard-gebruik-step1.png | Applicatiegebruik wizard - Step 1 | -| wizard-gebruik-fail.png | Applicatiegebruik wizard - 503 error | -| detail-app-overview.png | Test Wizard App detail page | -| wizard-app-submit-result.png | First wizard attempt failure (org UUID issue) | - ---- - -## Summary Statistics - -| Category | Count | -|----------|-------| -| Issues tested | 58 | -| PASS | 19 | -| FAIL | 2 | -| PARTIAL | 4 | -| CANNOT_TEST | 15 | -| CLOSED (verified) | 33 | -| BLOCKED | 1 | -| MOVED (to other persona) | 3 | -| New bugs found | 1 (Koppeling wizard Volgende disabled) | diff --git a/test-results/samenwerking/03-softwarecatalog-loaded.jpeg b/test-results/samenwerking/03-softwarecatalog-loaded.jpeg deleted file mode 100644 index c3cf64d1..00000000 Binary files a/test-results/samenwerking/03-softwarecatalog-loaded.jpeg and /dev/null differ diff --git a/test-results/samenwerking/04-dashboard-stats.jpeg b/test-results/samenwerking/04-dashboard-stats.jpeg deleted file mode 100644 index 53a87631..00000000 Binary files a/test-results/samenwerking/04-dashboard-stats.jpeg and /dev/null differ diff --git a/test-results/samenwerking/05-test-samenwerking-search.jpeg b/test-results/samenwerking/05-test-samenwerking-search.jpeg deleted file mode 100644 index 390b0c4e..00000000 Binary files a/test-results/samenwerking/05-test-samenwerking-search.jpeg and /dev/null differ diff --git a/test-results/samenwerking/06-opencatalogi-dashboard.jpeg b/test-results/samenwerking/06-opencatalogi-dashboard.jpeg deleted file mode 100644 index b9212581..00000000 Binary files a/test-results/samenwerking/06-opencatalogi-dashboard.jpeg and /dev/null differ diff --git a/test-results/samenwerking/r4-01-dashboard-login.jpeg b/test-results/samenwerking/r4-01-dashboard-login.jpeg deleted file mode 100644 index 1f3f2971..00000000 Binary files a/test-results/samenwerking/r4-01-dashboard-login.jpeg and /dev/null differ diff --git a/test-results/samenwerking/r4-01b-dashboard-full.jpeg b/test-results/samenwerking/r4-01b-dashboard-full.jpeg deleted file mode 100644 index 5b5d6b50..00000000 Binary files a/test-results/samenwerking/r4-01b-dashboard-full.jpeg and /dev/null differ diff --git a/test-results/samenwerking/r4-02-default-org-wizards.jpeg b/test-results/samenwerking/r4-02-default-org-wizards.jpeg deleted file mode 100644 index d4913c31..00000000 Binary files a/test-results/samenwerking/r4-02-default-org-wizards.jpeg and /dev/null differ diff --git a/test-results/samenwerking/r4-02-koppelingen-page.jpeg b/test-results/samenwerking/r4-02-koppelingen-page.jpeg deleted file mode 100644 index 807e7f5e..00000000 Binary files a/test-results/samenwerking/r4-02-koppelingen-page.jpeg and /dev/null differ diff --git a/test-results/samenwerking/r4-03-test-samenwerking-wizards-after-switch.jpeg b/test-results/samenwerking/r4-03-test-samenwerking-wizards-after-switch.jpeg deleted file mode 100644 index 50a8e1fd..00000000 Binary files a/test-results/samenwerking/r4-03-test-samenwerking-wizards-after-switch.jpeg and /dev/null differ diff --git a/test-results/samenwerking/r4-04-koppeling-wizard-no-apps.jpeg b/test-results/samenwerking/r4-04-koppeling-wizard-no-apps.jpeg deleted file mode 100644 index ddf89f7c..00000000 Binary files a/test-results/samenwerking/r4-04-koppeling-wizard-no-apps.jpeg and /dev/null differ diff --git a/test-results/samenwerking/results-authenticated.md b/test-results/samenwerking/results-authenticated.md deleted file mode 100644 index 59177213..00000000 --- a/test-results/samenwerking/results-authenticated.md +++ /dev/null @@ -1,203 +0,0 @@ -# Test Results: Samenwerking (Authenticated) - -**Persona:** Linda Bakker -- Coordinator at a municipal collaboration (samenwerkingsverband) -**Role:** Gebruik-beheerder -**Login:** linda.bakker@test.nl -**Environment:** http://localhost:3000 (Frontend), http://localhost:8080 (Backend) -**Date:** 2026-03-16 (Re-test #8) -**Browser:** Playwright (browser-5, headless) - ---- - -## Environment Status - -### Changes Since Re-test #7 -1. **Organisation 404 (downgraded from 500):** The org UUID `c0ff4d70-14f0-4852-9c18-ce522996119c` now returns 404 instead of 500. This means the org object was deleted or does not exist in the voorzieningen/organisatie register. UI degrades gracefully -- no crashes. -2. **Organization dropdown added:** Dashboard now shows an organization selector dropdown, allowing switching between "Default Organisation" and "Test Samenwerking". This was not present in re-test #7. -3. **Category search returns 0:** Searching with `categorie=koppeling` now returns 0 results (previously returned partial results). - -### Remaining Issues -1. **Organisation data 404 errors:** Fetching org object returns 404. Org-specific features partially unavailable. -2. **Beheer menu warnings:** "Beheer menu (position 7) not found" and "No beheer types found in menu" -- side navigation is missing. -3. **AangebodenGebruik API:** Not available after switching to Test Samenwerking. - ---- - -## Login Verification - -- **Status:** PASS -- **Details:** Successfully logged in as linda.bakker@test.nl. Dashboard loaded at `/beheer` showing "Mijn softwarecatalogus" heading, welcome section, and three wizard buttons. No crashes or TypeErrors. -- **localStorage cleared** before login as required. -- **Organisation confirmed:** "Test Samenwerking" available in organization dropdown and confirmed on /beheer/my-organisation page (heading shows "Test Samenwerking" with "Acties" button). -- **Screenshot:** `screenshots/01-dashboard-after-login.png` - ---- - -## Issue #57: Pakketten opvoeren voor samenwerkingsverband - -**Title:** Als gebruik-beheerder van een samenwerkingsverband wil ik softwarepakketten kunnen opvoeren -**Labels:** Gebruik, PvE eis -**Test Step:** Step 20 (Samenwerkingen en Multi-Organisatie Beheer) -**Previous Status:** PARTIAL (re-test #7) - -### Acceptance Criteria Results - -| # | Criterion | Type | Result | Notes | -|---|-----------|------|--------|-------| -| 1 | Samenwerking user can log in and see the dashboard without crash | HYBRID | **PASS** | Login succeeded, dashboard at /beheer loaded without crash. Three wizard buttons visible. Welcome text rendered correctly. | -| 2 | Dashboard shows organization name ("Test Samenwerking") | UI | **PASS** | Organization dropdown on dashboard shows "Test Samenwerking" after selection. Confirmed on /beheer/my-organisation page as h1 heading. | -| 3 | No `TypeError: Cannot read properties of undefined` in console | HYBRID | **PASS** | Console errors are exclusively 404s for organization data fetch. No TypeError related to user.userGroups or user.isAuthenticated. The optional chaining fix is working. | -| 4 | Welcome section renders correctly for gebruik-beheerder role | UI | **PASS** | Welcome card "Welkom in de softwarecatalogus" renders with three action descriptions: "Dienst registreren", "Gebruik registreren", "Koppeling registreren". Links to "Mijn Account" and "Mijn Organisatie" present and functional. | -| 5 | Wizards are available for samenwerking organizations | UI | **PASS** | Three wizard buttons visible: "Applicatie toevoegen", "Koppeling toevoegen", "Dienst toevoegen". Applicatie wizard at `/forms/gebruik/applicatie` opens with multi-step form (Applicatie > Gebruik configuratie > Controleren). Koppeling wizard at `/forms/gebruik/koppeling` loads correctly with search-first approach. | -| 6 | Samenwerking user can register packages on behalf of member municipalities | UI | **CANNOT_TEST** | Feature not yet implemented. The Applicatie wizard allows selecting applications but does not have an "on behalf of member municipality" option. No member municipality selector exists in the wizard flow. | - -### Key Findings - -**TypeError Fix Confirmed Stable (8th consecutive test):** Across all tested pages, no TypeError crashes occurred. The optional chaining fix applied to 6 files in February 2026 remains effective. - -**New: Organization Dropdown:** The dashboard now includes a "Selecteer organisatie" dropdown, allowing users to switch between their assigned organizations. This is a UI improvement for multi-org users like samenwerking coordinators. - -**Applicatie Wizard Functional:** The wizard opens with a search-based application selector, step indicators (Applicatie > Gebruik configuratie > Referentiecomponenten > Controleren), an info alert suggesting the search page as an alternative, and a fallback button "Ik kan de gewenste applicatie niet vinden". - -### Verdict: **PARTIAL** - -Criteria 1-5 all PASS (consistent with re-test #7). Criterion 6 remains CANNOT_TEST (member-municipality delegation feature not implemented). The core bug fix is solid; the remaining gap is the unimplemented feature. - -### Evidence - -| Screenshot | Description | -|------------|-------------| -| `screenshots/01-dashboard-after-login.png` | Dashboard with three wizard buttons after login | -| `screenshots/02-applicatie-wizard.png` | Applicatie wizard form (multi-step) | -| `screenshots/03-dashboard-test-samenwerking-selected.png` | Dashboard with Test Samenwerking selected in dropdown | -| `screenshots/08-mijn-organisatie.png` | My Organisation page showing "Test Samenwerking" | - ---- - -## Issue #186: Koppelingen - -**Title:** Koppelingen -**Labels:** Aanbod, Bevinding, Restpunt, Koppeling -**Test Step:** Step 11 (Koppeling wizard) -**Previous Status:** PARTIAL (re-test #7) - -### Acceptance Criteria Results - -| # | Criterion | Type | Result | Notes | -|---|-----------|------|--------|-------| -| 1 | Koppelingen display in a table format with readable titles (not blank or UUID-only) | API | **PARTIAL** | **Search results:** Koppeling titles display as UUID-based names (e.g., "00f20897-dfd8-540f-af0a-06253457bf24 -> 2731313c-ec58-5fee-bd5b-8e18e05c97f2") or arrow-only titles ("->", "<-", "<->") with "Onbekend" labels. Module name resolution fails (404 from /api/names/ endpoint). External service names DO resolve correctly (e.g., "BRK-PB - Basisregistratie Kadaster Publiekrechtelijke Beperkingenbesluiten"). **Category filter:** Searching with `categorie=koppeling` returns 0 results. | -| 2 | Koppelingen linked to "buitengemeentelijke voorzieningen" correctly display the referenced external service | API | **PASS** | External services resolve correctly. Confirmed on detail page: "BRI - Basisregistratie Inkomen" displays as buitengemeentelijke voorziening. In search results: "LV-BAG - Basisregistratie Adressen en Gebouwen", "BRK-PB - Basisregistratie Kadaster Publiekrechtelijke Beperkingenbesluiten" also resolve. | -| 3 | Koppelingen do not reference non-existent applications (graceful handling) | API | **PASS** | When module UUIDs cannot be resolved, the UI gracefully shows "Onbekend" in search results or the raw UUID on detail pages. No crashes or unhandled errors. The name resolution failure is logged as info/error but handled without breaking the UI. | -| 4 | Detail page shows all relevant fields | UI | **PARTIAL** | Detail page renders and shows: Applicatie A, Applicatie B (or Buitengemeentelijke voorziening), Richting (with arrow symbol), Transportprotocol, Status, Intermediair (when applicable). **Issues:** (a) Page title/h1 contains raw UUID for Applicatie A when name cannot be resolved, (b) Intermediair shows raw UUID, (c) No tabs visible on detail page, (d) "Koppeling aanbieden" button is present. Fields that reference modules show raw UUIDs when name resolution fails (404). | -| 5 | Koppeling detail page at /publicatie/{uuid} renders correctly | API | **PASS** | Both tested detail pages rendered without errors: internal koppeling (`ee8a270b`) showing all fields with UUIDs, and external koppeling (`908e894e`) showing resolved external service name. Pages load within 5 seconds, show structured field data. | - -### Detailed Findings - -#### Search Results Display -- **25,059 total results** on general search (all types mixed, sorted A-Z) -- First 3 results show arrow-only titles ("left-arrow", "right-arrow", "bidirectional-arrow") with "Onbekend left-arrow Onbekend" descriptions -- Subsequent results show UUID-based titles -- Each koppeling card correctly shows: type badge "Koppeling", status "In gebruik", formatted date -- "Standaardversies" field shows raw UUIDs -- Category filter (`categorie=koppeling`) returns 0 results -- koppelingen are not published as a separate category - -#### Detail Page: External Koppeling (908e894e) -- **Title:** "9ba4a796-9fa8-56bd-bb2c-27806c962985 left-arrow BRI - Basisregistratie Inkomen" -- **Applicatie A:** Raw UUID (9ba4a796...) -- name resolution 404 -- **Buitengemeentelijke voorziening:** "BRI - Basisregistratie Inkomen" (CORRECT) -- **Richting:** BnaarA (left-arrow) -- **Transportprotocol:** extern -- **Status:** in gebruik -- **Intermediair:** Raw UUID (f69fd93a...) -- name resolution 404 - -#### Detail Page: Internal Koppeling (ee8a270b) -- **Title:** "a0597415-8288-5430-8d85-d1416e5bf28c left-arrow f0b3e480-c1b1-54cb-a1da-808af0e83ff6" -- **Applicatie A:** Raw UUID -- name resolution 404 -- **Applicatie B:** Raw UUID -- name resolution 404 -- **Richting:** BnaarA (left-arrow) -- **Transportprotocol:** intern -- **Status:** In gebruik - -#### Koppeling Wizard -- Accessible from dashboard via "Koppeling toevoegen" button -- Opens at `/forms/gebruik/koppeling?type=aanbieden-koppeling` -- Multi-step flow: Een koppeling zoeken > Gebruiksinformatie > Deelnemers toevoegen > Controleren -- Step 1: "Controleren op bestaande koppeling" -- prompts user to check if koppeling exists first (good UX) -- Application dropdown with search functionality -- "Ik kan de gewenste koppeling niet vinden" button (disabled until application selected) -- "Volgende" button correctly disabled (validation working) - -#### Testing Note (per issues.md) -The issues.md states UUID-only titles are caused by "bad client data." Testing confirms this is primarily a **data quality issue** -- the module UUIDs stored in koppeling objects reference modules that do not exist in the local register's names API. The frontend correctly attempts to resolve names but the backend returns 404 for most module UUIDs. External services (buitengemeentelijke voorzieningen) DO resolve because they exist in a different dataset. - -### Verdict: **PARTIAL** - -Criteria 2, 3, and 5 PASS. Criteria 1 and 4 are PARTIAL. The core rendering logic works correctly; the display issues are caused by unresolvable module references in the data. - -### Evidence - -| Screenshot | Description | -|------------|-------------| -| `screenshots/04-koppeling-wizard.png` | Koppeling wizard form | -| `screenshots/05-koppeling-search-0-results.png` | Category search returns 0 results | -| `screenshots/06-koppeling-detail-extern.png` | External koppeling detail (UUID + resolved BRI name) | -| `screenshots/07-koppeling-detail-intern-uuids.png` | Internal koppeling detail (all UUIDs) | -| `screenshots/09-search-results-koppelingen-uuids.png` | Search results top | -| `screenshots/10-search-results-scrolled.png` | Search results with "Onbekend" labels | - ---- - -## Console Errors Summary - -| Page | Error Count | Type | Key Errors | -|------|-------------|------|------------| -| /login | 0 | -- | Clean | -| /beheer (dashboard) | 8 | 404 | org data fetch (c0ff4d70...) x4 duplicate | -| /forms/gebruik/applicatie | 4 | 404 | org data with deelnemers extension | -| /forms/gebruik/koppeling | 1 | error | org data with deelnemers extension | -| /beheer/my-organisation | 3 | 404/500 | org files fetch | -| /zoeken | 26 | 404 | Name resolution failures for module UUIDs | -| /publicatie/{extern} | 4 | 404 | Name resolution + uses/used endpoints | -| /publicatie/{intern} | 4 | 404 | Name resolution + uses/used endpoints | - ---- - -## Overall Summary - -| Issue | Title | Re-test #7 | Re-test #8 (current) | Trend | -|-------|-------|------------|----------------------|-------| -| #57 | Pakketten opvoeren voor samenwerkingsverband | PARTIAL (5/6) | **PARTIAL** (5/6) | Stable. New org dropdown. TypeError fix solid. | -| #186 | Koppelingen | PARTIAL (improved) | **PARTIAL** (3/5 pass) | Stable. Detail pages work. Name resolution remains the core issue. | - -### Remaining Issues - -1. **[MEDIUM] Module name resolution failures:** The `/api/names/{uuid}` endpoint returns 404 for most module UUIDs referenced in koppelingen. This causes UUID-only titles, "Onbekend" labels in search results, and raw UUIDs on detail pages. Root cause: module objects are not in the local register or names index. - -2. **[MEDIUM] Category search filter:** Searching with `categorie=koppeling` returns 0 results. Koppelingen are only findable through the general search (25,059 mixed results). - -3. **[LOW] Organisation data 404:** Org UUID `c0ff4d70-14f0-4852-9c18-ce522996119c` returns 404 consistently. Multiple error log entries triggered per page load. - -4. **[FEATURE GAP] Member municipality delegation:** Issue #57 criterion 6 -- registering packages on behalf of member municipalities -- remains unimplemented. - ---- - -## Test Data Cleanup - -No test data was created during this test session. All testing was read-only (navigation and observation). No cleanup required. - ---- - -## Screenshots Index - -| File | Description | -|------|-------------| -| `screenshots/01-dashboard-after-login.png` | Dashboard with three wizard buttons after login | -| `screenshots/02-applicatie-wizard.png` | Applicatie wizard form (multi-step) | -| `screenshots/03-dashboard-test-samenwerking-selected.png` | Dashboard with Test Samenwerking selected | -| `screenshots/04-koppeling-wizard.png` | Koppeling wizard form | -| `screenshots/05-koppeling-search-0-results.png` | Category search returns 0 results | -| `screenshots/06-koppeling-detail-extern.png` | External koppeling detail page | -| `screenshots/07-koppeling-detail-intern-uuids.png` | Internal koppeling detail page | -| `screenshots/08-mijn-organisatie.png` | My Organisation page | -| `screenshots/09-search-results-koppelingen-uuids.png` | Search results top | -| `screenshots/10-search-results-scrolled.png` | Search results with Onbekend labels | diff --git a/test-results/security-officer/results-authenticated.md b/test-results/security-officer/results-authenticated.md deleted file mode 100644 index 2a80d53f..00000000 --- a/test-results/security-officer/results-authenticated.md +++ /dev/null @@ -1,265 +0,0 @@ -# Security Officer Test Results — Authenticated Session - -**Persona:** Mark Jansen (Information Security Officer) -**Username:** mark.jansen@test.nl -**Groups:** gebruik-beheerder, software-catalog-users -**Organization:** Test Gemeente -**Date:** 2026-03-16 -**Environment:** Frontend http://localhost:3000 / Backend http://localhost:8080 -**Browser:** Playwright (Chromium, 1920x1080) - ---- - -## Summary - -| Category | Pass | Partial | Fail | Cannot Test | Total | -|----------|------|---------|------|-------------|-------| -| RBAC/Security | 4 | 1 | 0 | 1 | 6 | -| Privacy | 2 | 1 | 0 | 0 | 3 | -| UI/UX | 0 | 3 | 2 | 0 | 5 | -| **Total** | **6** | **5** | **2** | **1** | **14** | - ---- - -## RBAC Verification Results - -### Unauthenticated API Access Tests - -| Schema | Register API (objects/3/{id}) | Publications API | Expected | Status | -|--------|-------------------------------|-----------------|----------|--------| -| contactpersoon (7) | 0 results (RBAC=true) | N/A — not a publication type | Blocked | PASS | -| koppeling (11) | 0 results (RBAC=true) | N/A — not a publication type | Blocked | PASS | -| gebruik (9) | 0 results (RBAC=true) | N/A — not a publication type | Blocked | PASS | -| organisatie (8) | 102 results (RBAC=true) | Via publications: visible | Public readable | PASS | -| module (19) | N/A | 146 results (Leverancier only) | Public for Leverancier | PASS | -| Admin endpoints (/api/registers) | 401 "not logged in" | N/A | Blocked | PASS | - -### Authenticated API Access Tests (Mark Jansen — gebruik-beheerder) - -| Schema | Result | Expected per RBAC | Status | -|--------|--------|-------------------|--------| -| contactpersoon (7) | 305 results (all orgs) | gebruik-beheerder: read all | PASS | -| koppeling (11) | 0 via slug, many via admin | gebruik-beheerder: read all | INCONCLUSIVE — may need different API path | -| gebruik (9) | 0 via slug | gebruik-beheerder: read all | INCONCLUSIVE — may need different API path | -| organisatie (8) | 0 via slug, 102 via publications | public readable | PASS | - ---- - -## Issue Test Results - -### #394: Contactpersonen van gemeenten publiekelijk zichtbaar -**Status: PASS** -**Severity: Resolved** - -All acceptance criteria verified: -- [x] [API] Leverancier contacts visible on public pages — publications show leverancier data, contactpersoon fields return empty arrays (no personal data exposed) -- [x] [API] Gemeente contactpersonen NOT visible to unauthenticated users — register API returns 0 results for contactpersoon schema without auth -- [x] [API] Samenwerking contactpersonen NOT visible — same RBAC blocks as gemeente -- [x] [API] Public API `_extend=contactpersonen` returns 0 contacts for all publications (unauthenticated) -- [x] [API] No personal contact information leaks on public pages -- [x] [API] Authenticated gebruik-beheerder (Mark Jansen) sees 305 contactpersonen across all orgs — correct per RBAC rules - -**Evidence:** -- Unauthenticated `objects/3/7` (contactpersoon): 0 results -- Authenticated as mark.jansen: 305 results -- Publications with `_extend[]=contactpersonen`: 0 contacts returned (unauthenticated) - ---- - -### #183: Wachtwoord vergeten optie -**Status: PARTIAL** -**Severity: MEDIUM** - -- [x] [UI] "Wachtwoord vergeten?" button present on login page -- [x] [UI] Clicking navigates to /reminder page -- [x] [UI] Page shows email input field with placeholder "uw.email@voorbeeld.nl" -- [x] [UI] "Verstuur code" button present -- [x] [UI] "Terug naar inloggen" button present -- [ ] [UI] Cannot verify email delivery — SMTP disabled on test environment (expected per MEMORY.md) - -**Note:** Feature is implemented and UI flow works. Email delivery cannot be tested due to infrastructure (SMTP disabled). Previously PARTIAL, remains PARTIAL. - ---- - -### #404: Regelmatig witte schermen -**Status: PASS** -**Severity: LOW (not reproducible)** - -Tested multiple scenarios per the testing hints: -- [x] [UI] Direct URL navigation to `/beheer/applicaties` — page loads correctly -- [x] [UI] F5 refresh on `/beheer/applicaties` — page reloads correctly, no white screen -- [x] [UI] Direct URL navigation to `/beheer/diensten` — page loads correctly -- [x] [UI] Direct URL navigation to `/beheer/koppelingen` — page loads (content initially empty, then loads) -- [x] [UI] F5 refresh on `/zoeken` — page reloads correctly -- [x] [UI] Rapid navigation between beheer pages — no white screens observed -- [x] [UI] Direct URL to `/publicatie/{id}` — page loads correctly -- [x] [UI] Console shows no critical JS errors causing blank rendering (errors are 404s from names API, not rendering failures) - -**Note:** White screen not reproduced in 10+ navigation attempts across multiple pages. PASS with note: "White screen not reproducible in automated testing on 2026-03-16." - ---- - -### #395: Menu linkerkant verdwijnt -**Status: FAIL** -**Severity: HIGH** - -- [ ] [UI] Left navigation menu is NOT visible on any beheer page — completely absent -- [ ] [UI] After F5 refresh on `/beheer/applicaties` — no left sidebar menu -- [ ] [UI] After direct URL navigation to `/beheer/diensten` — no left sidebar -- [ ] [UI] After direct URL navigation to `/beheer/koppelingen` — no left sidebar -- [ ] [UI] Menu NOT present when directly navigating to URL - -**Root Cause:** Console warnings: "Beheer menu (position 7) not found or has no items" and "No beheer types found in menu". The left sidebar navigation menu is completely missing from all beheer pages. This is not a viewport/responsive issue (tested at 1920x1080). The menu configuration appears broken — the frontend cannot find menu items at position 7. - -**Evidence:** Screenshots: `screenshots/beheer-applicaties-no-sidebar.png`, `screenshots/beheer-dashboard-mark.png` - ---- - -### #409: Footer anders: inlog of uitgelogd -**Status: PASS** -**Severity: LOW** - -- [x] [API] Footer content is identical in both states: "Softwarecatalogus" + "Een plek voor alle software voor en door Gemeenten" -- [x] [API] No "Privacyverklaring" or "Algemene voorwaarden" links in footer in either state (footer is minimal) -- [x] [UI] Footer styling appears consistent between logged-in and logged-out states - -**Note:** The footer is minimal (just text, no links) in both states. The original issue about different links is no longer applicable — there are no footer links at all. The main navigation has "Privacy" and "Terms" links in both states. - ---- - -### #406: SiteImprove verwijderen -**Status: PASS** -**Severity: LOW (resolved)** - -- [x] [API] HTML source does NOT contain `siteimproveanalytics.com` script tag — confirmed via page source inspection -- [x] [API] No references to "siteimprove" in page source -- [x] [API] Piwik Pro analytics script present but inactive (empty configuration variables e, t, a) -- [x] [API] Only one analytics script position configured - -**Evidence:** `grep -i siteimprove` on page source returns no results. Piwik script present but with empty config vars. - ---- - -### #85: (VNGR) Publieke API toegang tot aanbodinformatie -**Status: PARTIAL** -**Severity: MEDIUM** - -- [x] [API] Public API accessible and returns data (146 publications) -- [ ] [API] OAS documentation endpoint returns 500 error: `/api/registers/3/oas` fails (known issue — organisation field causes 500 for unauthenticated requests) -- [x] [API] API returns data about aanbiedende organisaties (via publications) -- [x] [API] API returns data about aangeboden softwarepakketten -- [x] [API] Supports standard query parameters (_limit, _search, etc.) -- [x] [API] Pagination works correctly (page, pages, limit, offset in response) - -**Note:** OAS endpoint bug is documented in acceptance criteria. All other API access works correctly. - ---- - -### #315: Hoge prioriteit: Zoekpagina toont deel gemeentelijk applicatielandschap -**Status: PASS** -**Severity: RESOLVED** - -- [x] [API] Publications returned by public API show ONLY `geregistreerdDoor: Leverancier` — 0 results with `Gemeente` as supplier -- [x] [API] 44 out of 146 publications have Leverancier as geregistreerdDoor (rest have null/other) -- [x] [API] Municipal application landscape data not publicly visible via register API (gebruik, koppeling return 0 results unauthenticated) -- [x] [API] RBAC-based filtering is active (rbac=true in API response metadata) - -**Note:** However, the search page FACETS expose metadata about private data types (see Additional Security Findings below). - ---- - -### #447: Zoeken — concept leverancier zonder VNG triage direct vindbaar -**Status: CANNOT_TEST** -**Severity: MEDIUM** - -- No organisations with status "Concept" exist in the test environment -- Cannot verify if concept organisations would appear in search results -- The publications API search for "concept" returns 0 results - -**Note:** This issue requires a concept organisation to be created via the registration form to test properly. No such test data exists. - ---- - -### #455: Tabblad koppelingen en contactpersonen publiekelijk niet getoond — RBAC? -**Status: FAIL** -**Severity: HIGH** - -- [ ] [HYBRID] "Koppelingen" tab NOT visible on application detail page (unauthenticated) — only "Standaarden (0)" and "Geschikt voor (0)" tabs shown -- [ ] [HYBRID] "Contactpersonen" tab NOT visible on application detail page (unauthenticated) — missing -- [ ] [HYBRID] Same tabs missing when AUTHENTICATED as Mark Jansen — this is not just a public visibility issue -- [ ] [API] Server returns 500 errors for `/publications/{id}/uses` and `/publications/{id}/used` endpoints — both authenticated and unauthenticated -- [ ] [UI] The publication detail page shows only 2 tabs regardless of auth state - -**Root Cause:** The backend endpoints for fetching related objects (koppelingen, contactpersonen) on the publication detail page return 500 Internal Server Error. This prevents the frontend from rendering the Koppelingen and Contactpersonen tabs. - -**Evidence:** Screenshots: `screenshots/publication-detail-authenticated.png`, `screenshots/publication-detail-unauthenticated.png`. Console errors: "Error fetching uses: Internal Server Error", "Error fetching used: Internal Server Error". - ---- - -## Additional Security Findings - -### MEDIUM: Search Page Exposes Private Data Type Counts in Facets - -**Severity: MEDIUM** -**Location:** `/zoeken` page (unauthenticated) - -The public search page at `/zoeken` displays facet filters that reveal the count of private data types: -- **Type filter shows:** Applicatie (69), Contactpersoon (305), Gebruik (19,502), Koppeling (4,980), Organisatie (203) -- **Geregistreerd door filter shows:** Gemeente (4,440), Leverancier (...), Samenwerking (...) - -While the actual DATA records are not accessible (clicking Contactpersoon returns 0 results), the **metadata counts** reveal: -1. The exact number of contact persons in the system (305) -2. The exact number of usage records (19,502) — this is municipal private data -3. The exact number of connections (4,980) -4. The number of municipalities using the system (via Gemeente count: 4,440) - -**Recommendation:** The faceting/search API should exclude non-public schema types (contactpersoon, gebruik, koppeling) from the facet response for unauthenticated users, or the frontend should filter these out before rendering. - -**Evidence:** Screenshot: `screenshots/search-page-unauthenticated.png` - -### MEDIUM: Search Results Show "Geen titel" and Broken Links - -**Severity: MEDIUM** -**Location:** `/zoeken` page (both authenticated and unauthenticated) - -All search result cards display: -- Title: "Geen titel" (No title) -- Links: `/publicatie/undefined` (broken) -- Standaardversies: Raw UUIDs instead of human-readable names - -**Root Cause:** The `/api/apps/openregister/api/names/{uuid}` endpoint returns 404 for most UUIDs (26+ errors per page load). The search cards fail to resolve names and IDs, rendering as blank/broken. - -### LOW: Organization Assignment Inconsistency - -On first login, Mark Jansen was assigned to "Default Organisation" instead of "Test Gemeente". After logging out and back in, the correct organisation "Test Gemeente" was displayed. Console shows errors: "Error fetching voorzieningen_organisatie" with failed requests. - -### INFO: Console Warnings on Every Page Load - -Every beheer page load produces: -- "Beheer menu (position 7) not found or has no items" -- "No beheer types found in menu" - -These warnings correlate with the missing left sidebar navigation (#395). - ---- - -## Test Environment Notes - -- All tests performed on local dev environment (localhost:3000 / localhost:8080) -- SMTP disabled — email-dependent features (password reset delivery) cannot be verified -- Test data created by `test-setup.sh` script -- No concept organisations exist in test data (limits #447 testing) -- Nextcloud backend authentication: admin:admin -- Mark Jansen credentials: mark.jansen@test.nl / WelcomeToTest2026 - ---- - -## Screenshots - -| File | Description | -|------|-------------| -| `screenshots/search-page-unauthenticated.png` | Public search showing 25,059 results with private type counts in facets | -| `screenshots/beheer-dashboard-mark.png` | Dashboard showing Default Organisation (first login issue) | -| `screenshots/beheer-applicaties-no-sidebar.png` | Beheer applicaties — no left sidebar menu | -| `screenshots/publication-detail-authenticated.png` | App detail — missing Koppelingen/Contactpersonen tabs (authenticated) | -| `screenshots/publication-detail-unauthenticated.png` | App detail — missing Koppelingen/Contactpersonen tabs (unauthenticated) | diff --git a/test-results/security-officer/retest-395-455.md b/test-results/security-officer/retest-395-455.md deleted file mode 100644 index f57d91e4..00000000 --- a/test-results/security-officer/retest-395-455.md +++ /dev/null @@ -1,65 +0,0 @@ -# Retest Issues #395 and #455 - -**Date:** 2026-03-16 -**User:** Mark Jansen (mark.jansen@test.nl) - Security Officer, Test Gemeente -**Environment:** http://localhost:3000 (Softwarecatalogus frontend) - ---- - -## Issue #395 — Beheer sidebar navigation missing / "Beheer menu (position 7) not found" warning - -**Status: PASS** - -### Steps performed -1. Logged in as mark.jansen@test.nl -2. Navigated to /beheer/applicaties -3. Checked sidebar navigation -4. Checked browser console for warnings - -### Results -- Left sidebar navigation is **fully present** on all beheer pages, including: - - Dashboard - - Mijn Account - - Mijn Organisatie - - Diensten - - Contactpersonen - - Applicaties - - Gebruik - - Koppelingen - - View -- **No "Beheer menu (position 7) not found" warnings** in the console (0 warnings total on beheer pages). -- On initial page load the sidebar briefly delays rendering (content loads asynchronously), but it appears correctly within ~1 second. - ---- - -## Issue #455 — Koppelingen and Contactpersonen tabs missing on publication detail page - -**Status: FAIL** - -### Steps performed -1. From /zoeken, filtered by Type = Applicatie (75 results) -2. Opened publication detail: "Test Applicatie Gemeente" (/publicatie/de36369a-c898-4fbd-85d5-fa0132825213) -3. Checked visible tabs on the detail page - -### Results -- **Tabs present:** - - Standaarden (0) - - Geschikt voor (0) - - Applicatieversies (1) -- **Tabs missing:** - - Koppelingen — NOT visible - - Contactpersonen — NOT visible -- The publication detail page does not show Koppelingen or Contactpersonen tabs for this applicatie. Issue #455 is **not resolved**. - -### Console notes -- 1 warning: "No schema normalization needed or possible" (benign) -- 26 errors: all 404s on `/api/apps/openregister/api/names/{uuid}` — these are name resolution failures for VNG GEMMA UUIDs on the search page, unrelated to #455 but worth tracking separately. - ---- - -## Summary - -| Issue | Description | Result | -|-------|-------------|--------| -| #395 | Beheer sidebar navigation missing | PASS | -| #455 | Koppelingen/Contactpersonen tabs on detail | FAIL |