From f7b318a0027ec9cc7ff4f4f7728d1e1e0d397b5b Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 20 Apr 2026 07:36:44 +0200 Subject: [PATCH 1/6] =?UTF-8?q?chore(quality):=20run=20phpcbf=20=E2=80=94?= =?UTF-8?q?=201147=20auto-fixable=20phpcs=20violations=20resolved?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before: 1540 errors across 47 lib/ files After: 393 errors across 45 lib/ files Remaining violations are non-auto-fixable (named-parameter rewrites, operator !/=== FALSE swaps, implicit truthy, inline-if rewrites) and need human or reviewer judgment. --- lib/BackgroundJob/AppointmentReminderJob.php | 22 +- .../BerichtenboxReadStatusJob.php | 9 +- lib/BackgroundJob/ShareMaintenanceJob.php | 2 +- lib/Controller/AiController.php | 24 +- lib/Controller/AppointmentController.php | 34 ++- lib/Controller/BerichtenboxController.php | 39 ++- lib/Controller/CaseDefinitionController.php | 42 ++- lib/Controller/CaseSharingController.php | 24 +- lib/Controller/ConsultationController.php | 21 +- lib/Controller/EmailController.php | 37 ++- lib/Controller/InspectionController.php | 86 +++--- lib/Controller/LegesController.php | 75 +++--- lib/Controller/MetricsController.php | 74 ++++-- lib/Controller/MilestoneController.php | 15 +- lib/Controller/ParaferingController.php | 68 ++--- .../PublicAppointmentController.php | 30 ++- lib/Controller/PublicShareController.php | 40 +-- lib/Controller/StufController.php | 96 +++---- lib/Controller/TemplateController.php | 15 +- lib/Middleware/TenantMiddleware.php | 18 +- lib/Service/AiService.php | 246 ++++++++++-------- lib/Service/AppointmentBackend/JccBackend.php | 12 +- .../AppointmentBackend/LocalBackend.php | 12 +- .../AppointmentBackend/QmaticBackend.php | 15 +- lib/Service/AppointmentService.php | 54 ++-- .../BerichtenboxAdapterInterface.php | 4 +- .../BerichtenboxAdapter/MockAdapter.php | 27 +- lib/Service/BerichtenboxService.php | 41 +-- lib/Service/CaseDefinitionExportService.php | 66 ++--- lib/Service/CaseDefinitionImportService.php | 94 +++---- lib/Service/CaseEmailService.php | 157 ++++++----- lib/Service/CaseSharingService.php | 12 +- lib/Service/CaseTransferService.php | 6 +- lib/Service/ChecklistService.php | 48 ++-- lib/Service/ConsultationService.php | 44 ++-- lib/Service/DsoIntakeService.php | 43 ++- lib/Service/InspectionService.php | 102 ++++---- lib/Service/LegesCalculationService.php | 100 +++---- lib/Service/LegesExportService.php | 88 +++---- lib/Service/MilestoneService.php | 48 ++-- lib/Service/ParaferingService.php | 122 ++++----- lib/Service/StufFieldMappingService.php | 90 +++---- lib/Service/StufMessageBuilder.php | 80 +++--- lib/Service/TemplateLibraryService.php | 46 ++-- lib/Service/TenantService.php | 14 +- lib/Service/ZgwZrcRulesService.php | 4 +- 46 files changed, 1205 insertions(+), 1141 deletions(-) diff --git a/lib/BackgroundJob/AppointmentReminderJob.php b/lib/BackgroundJob/AppointmentReminderJob.php index 3ff6ef70..23fe5d3c 100644 --- a/lib/BackgroundJob/AppointmentReminderJob.php +++ b/lib/BackgroundJob/AppointmentReminderJob.php @@ -21,8 +21,9 @@ public function __construct( private LoggerInterface $logger, ) { parent::__construct($time); - $this->setInterval(86400); // Daily. - } + $this->setInterval(86400); + // Daily. + }//end __construct() protected function run($argument): void { @@ -50,19 +51,22 @@ protected function run($argument): void ); foreach (($result['objects'] ?? []) as $apt) { - $data = is_object($apt) ? $apt->jsonSerialize() : $apt; + $data = is_object($apt) ? $apt->jsonSerialize() : $apt; $aptDate = substr($data['dateTime'] ?? '', 0, 10); if ($aptDate === $tomorrow && empty($data['reminderSent'])) { $data['reminderSent'] = true; $objectService->saveObject((int) $register, (int) $schema, $data); - $this->logger->info('Procest: Reminder sent for appointment', [ - 'appointmentId' => $data['uuid'] ?? $data['id'] ?? '', - ]); + $this->logger->info( + 'Procest: Reminder sent for appointment', + [ + 'appointmentId' => $data['uuid'] ?? $data['id'] ?? '', + ] + ); } } } catch (\Exception $e) { $this->logger->error('Procest: Reminder job error: '.$e->getMessage()); - } - } -} + }//end try + }//end run() +}//end class diff --git a/lib/BackgroundJob/BerichtenboxReadStatusJob.php b/lib/BackgroundJob/BerichtenboxReadStatusJob.php index e0af0cab..b8ca5958 100644 --- a/lib/BackgroundJob/BerichtenboxReadStatusJob.php +++ b/lib/BackgroundJob/BerichtenboxReadStatusJob.php @@ -17,13 +17,14 @@ public function __construct( private LoggerInterface $logger, ) { parent::__construct($time); - $this->setInterval(86400); // Daily. - } + $this->setInterval(86400); + // Daily. + }//end __construct() protected function run($argument): void { $this->logger->info('Procest: Running Berichtenbox read status poll'); // The actual polling happens in BerichtenboxService::pollReadStatus // This job would iterate unread messages and poll each one. - } -} + }//end run() +}//end class diff --git a/lib/BackgroundJob/ShareMaintenanceJob.php b/lib/BackgroundJob/ShareMaintenanceJob.php index c1acbe3e..933f2fd1 100644 --- a/lib/BackgroundJob/ShareMaintenanceJob.php +++ b/lib/BackgroundJob/ShareMaintenanceJob.php @@ -47,7 +47,7 @@ class ShareMaintenanceJob extends TimedJob * @param ITimeFactory $time The time factory * @param SettingsService $settingsService The settings service * @param IAppManager $appManager The app manager - * @param ContainerInterface $container The DI container + * @param ContainerInterface $container The DI container * @param LoggerInterface $logger The logger * * @return void diff --git a/lib/Controller/AiController.php b/lib/Controller/AiController.php index f9c24cbd..4339c066 100644 --- a/lib/Controller/AiController.php +++ b/lib/Controller/AiController.php @@ -47,12 +47,12 @@ class AiController extends Controller /** * Constructor for AiController. * - * @param string $appName The application name - * @param IRequest $request The request object - * @param AiService $aiService The AI service - * @param SettingsService $settingsService The settings service - * @param IUserSession $userSession The user session - * @param LoggerInterface $logger The logger interface + * @param string $appName The application name + * @param IRequest $request The request object + * @param AiService $aiService The AI service + * @param SettingsService $settingsService The settings service + * @param IUserSession $userSession The user session + * @param LoggerInterface $logger The logger interface * * @return void */ @@ -277,11 +277,13 @@ public function auditIndex(): JSONResponse 'offset' => (int) $this->request->getParam('offset', '0'), ]; - return new JSONResponse([ - 'success' => true, - 'filters' => array_filter($filters), - 'message' => 'Audit trail query — implement with OpenRegister object listing', - ]); + return new JSONResponse( + [ + 'success' => true, + 'filters' => array_filter($filters), + 'message' => 'Audit trail query — implement with OpenRegister object listing', + ] + ); }//end auditIndex() /** diff --git a/lib/Controller/AppointmentController.php b/lib/Controller/AppointmentController.php index 12f12cfa..a52c19e5 100644 --- a/lib/Controller/AppointmentController.php +++ b/lib/Controller/AppointmentController.php @@ -17,17 +17,21 @@ public function __construct( private AppointmentService $appointmentService, ) { parent::__construct(appName: Application::APP_ID, request: $request); - } + }//end __construct() - /** @NoAdminRequired */ + /** + * @NoAdminRequired + */ public function index(): JSONResponse { $caseId = $this->request->getParam('caseId'); $appointments = $this->appointmentService->getAppointmentsForCase($caseId ?? ''); return new JSONResponse(['success' => true, 'appointments' => $appointments]); - } + }//end index() - /** @NoAdminRequired */ + /** + * @NoAdminRequired + */ public function create(): JSONResponse { $caseId = $this->request->getParam('caseId'); @@ -48,23 +52,29 @@ public function create(): JSONResponse $result = $this->appointmentService->bookAppointment($caseId, $data); return new JSONResponse(['success' => true, 'appointment' => $result]); - } + }//end create() - /** @NoAdminRequired */ + /** + * @NoAdminRequired + */ public function cancel(string $appointmentId): JSONResponse { $result = $this->appointmentService->cancelAppointment($appointmentId); return new JSONResponse(['success' => true, 'appointment' => $result]); - } + }//end cancel() - /** @NoAdminRequired */ + /** + * @NoAdminRequired + */ public function noShow(string $appointmentId): JSONResponse { $result = $this->appointmentService->markNoShow($appointmentId); return new JSONResponse(['success' => true, 'appointment' => $result]); - } + }//end noShow() - /** @NoAdminRequired */ + /** + * @NoAdminRequired + */ public function timeslots(): JSONResponse { $productId = $this->request->getParam('productId', ''); @@ -73,5 +83,5 @@ public function timeslots(): JSONResponse $slots = $this->appointmentService->getTimeslots($productId, $locationId, $date); return new JSONResponse(['success' => true, 'timeslots' => $slots]); - } -} + }//end timeslots() +}//end class diff --git a/lib/Controller/BerichtenboxController.php b/lib/Controller/BerichtenboxController.php index 662ba3b7..7f68bd0b 100644 --- a/lib/Controller/BerichtenboxController.php +++ b/lib/Controller/BerichtenboxController.php @@ -17,16 +17,18 @@ public function __construct( private BerichtenboxService $berichtenboxService, ) { parent::__construct(appName: Application::APP_ID, request: $request); - } + }//end __construct() - /** @NoAdminRequired */ + /** + * @NoAdminRequired + */ public function send(): JSONResponse { - $caseId = $this->request->getParam('caseId'); - $bsn = $this->request->getParam('bsn', ''); - $subject = $this->request->getParam('subject', ''); - $body = $this->request->getParam('body', ''); - $typeCode = $this->request->getParam('berichtTypeCode', ''); + $caseId = $this->request->getParam('caseId'); + $bsn = $this->request->getParam('bsn', ''); + $subject = $this->request->getParam('subject', ''); + $body = $this->request->getParam('body', ''); + $typeCode = $this->request->getParam('berichtTypeCode', ''); $attachmentFileId = $this->request->getParam('attachmentFileId'); if (empty($caseId) === true) { @@ -34,7 +36,12 @@ public function send(): JSONResponse } $result = $this->berichtenboxService->sendMessage( - $caseId, $bsn, $subject, $body, $typeCode, $attachmentFileId + $caseId, + $bsn, + $subject, + $body, + $typeCode, + $attachmentFileId ); if (isset($result['error']) === true) { @@ -42,20 +49,24 @@ public function send(): JSONResponse } return new JSONResponse(['success' => true, 'message' => $result]); - } + }//end send() - /** @NoAdminRequired */ + /** + * @NoAdminRequired + */ public function messages(): JSONResponse { $caseId = $this->request->getParam('caseId', ''); $messages = $this->berichtenboxService->getMessagesForCase($caseId); return new JSONResponse(['success' => true, 'messages' => $messages]); - } + }//end messages() - /** @NoAdminRequired */ + /** + * @NoAdminRequired + */ public function poll(string $messageId): JSONResponse { $result = $this->berichtenboxService->pollReadStatus($messageId); return new JSONResponse(['success' => true, 'message' => $result]); - } -} + }//end poll() +}//end class diff --git a/lib/Controller/CaseDefinitionController.php b/lib/Controller/CaseDefinitionController.php index fab2601f..22b5adfa 100644 --- a/lib/Controller/CaseDefinitionController.php +++ b/lib/Controller/CaseDefinitionController.php @@ -41,11 +41,11 @@ class CaseDefinitionController extends Controller /** * Constructor. * - * @param string $appName The app name. - * @param IRequest $request The request object. - * @param CaseDefinitionExportService $exportService The export service. - * @param CaseDefinitionImportService $importService The import service. - * @param LoggerInterface $logger The logger. + * @param string $appName The app name. + * @param IRequest $request The request object. + * @param CaseDefinitionExportService $exportService The export service. + * @param CaseDefinitionImportService $importService The import service. + * @param LoggerInterface $logger The logger. */ public function __construct( string $appName, @@ -55,7 +55,7 @@ public function __construct( private readonly LoggerInterface $logger, ) { parent::__construct($appName, $request); - } + }//end __construct() /** * Export a case definition as a ZIP archive. @@ -104,13 +104,13 @@ public function export(): DataDownloadResponse|JSONResponse Http::STATUS_BAD_REQUEST ); } catch (\Throwable $e) { - $this->logger->error('Case definition export failed: ' . $e->getMessage()); + $this->logger->error('Case definition export failed: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Export failed: ' . $e->getMessage()], + ['error' => 'Export failed: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } + }//end try + }//end export() /** * Validate a case definition package without importing it. @@ -135,13 +135,13 @@ public function validate(): JSONResponse return new JSONResponse($result); } catch (\Throwable $e) { - $this->logger->error('Case definition validation failed: ' . $e->getMessage()); + $this->logger->error('Case definition validation failed: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Validation failed: ' . $e->getMessage()], + ['error' => 'Validation failed: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); } - } + }//end validate() /** * Import a case definition package. @@ -153,7 +153,7 @@ public function validate(): JSONResponse public function import(): JSONResponse { try { - $file = $this->request->getUploadedFile('package'); + $file = $this->request->getUploadedFile('package'); $strategy = $this->request->getParam('strategy', 'skip'); if ($file === null || !isset($file['tmp_name'])) { @@ -175,17 +175,15 @@ public function import(): JSONResponse $strategy ); - $statusCode = $result['success'] - ? Http::STATUS_OK - : Http::STATUS_UNPROCESSABLE_ENTITY; + $statusCode = $result['success'] ? Http::STATUS_OK : Http::STATUS_UNPROCESSABLE_ENTITY; return new JSONResponse($result, $statusCode); } catch (\Throwable $e) { - $this->logger->error('Case definition import failed: ' . $e->getMessage()); + $this->logger->error('Case definition import failed: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Import failed: ' . $e->getMessage()], + ['error' => 'Import failed: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } -} + }//end try + }//end import() +}//end class diff --git a/lib/Controller/CaseSharingController.php b/lib/Controller/CaseSharingController.php index ccddee65..4a895837 100644 --- a/lib/Controller/CaseSharingController.php +++ b/lib/Controller/CaseSharingController.php @@ -40,13 +40,13 @@ class CaseSharingController extends Controller /** * Constructor for the CaseSharingController. * - * @param IRequest $request The request object - * @param CaseSharingService $caseSharingService The sharing service - * @param CaseTransferService $caseTransferService The transfer service - * @param SettingsService $settingsService The settings service - * @param IAppManager $appManager The app manager - * @param ContainerInterface $container The DI container - * @param IUserSession $userSession The user session + * @param IRequest $request The request object + * @param CaseSharingService $caseSharingService The sharing service + * @param CaseTransferService $caseTransferService The transfer service + * @param SettingsService $settingsService The settings service + * @param IAppManager $appManager The app manager + * @param ContainerInterface $container The DI container + * @param IUserSession $userSession The user session * * @return void * @@ -134,7 +134,7 @@ public function createShare(): JSONResponse $password, $fieldExclusions, ); - } + }//end if return new JSONResponse(['success' => true, 'share' => $share]); }//end createShare() @@ -168,11 +168,11 @@ public function revokeShare(string $shareId): JSONResponse */ public function initiateTransfer(): JSONResponse { - $caseId = $this->request->getParam('caseId'); + $caseId = $this->request->getParam('caseId'); $sourceOrganization = $this->request->getParam('sourceOrganization', ''); $targetOrganization = $this->request->getParam('targetOrganization'); - $reason = $this->request->getParam('reason', ''); - $requestedDate = $this->request->getParam('requestedDate', date('Y-m-d')); + $reason = $this->request->getParam('reason', ''); + $requestedDate = $this->request->getParam('requestedDate', date('Y-m-d')); if (empty($caseId) === true || empty($targetOrganization) === true) { return new JSONResponse( @@ -207,7 +207,7 @@ public function handleTransfer(string $transferId): JSONResponse if ($action === 'accept') { $result = $this->caseTransferService->acceptTransfer($transferId); - } elseif ($action === 'reject') { + } else if ($action === 'reject') { $reason = $this->request->getParam('reason', ''); $result = $this->caseTransferService->rejectTransfer($transferId, $reason); } else { diff --git a/lib/Controller/ConsultationController.php b/lib/Controller/ConsultationController.php index 64cec7b8..159755fa 100644 --- a/lib/Controller/ConsultationController.php +++ b/lib/Controller/ConsultationController.php @@ -31,8 +31,6 @@ */ class ConsultationController extends Controller { - - /** * Constructor. * @@ -46,8 +44,7 @@ public function __construct( private readonly ConsultationService $consultationService, ) { parent::__construct($appName, $request); - } - + }//end __construct() /** * List consultations for a case. @@ -62,8 +59,7 @@ public function index(string $caseId): JSONResponse { $consultations = $this->consultationService->getConsultationsForCase($caseId); return new JSONResponse(['results' => $consultations]); - } - + }//end index() /** * Create a new consultation. @@ -81,8 +77,7 @@ public function create(): JSONResponse } catch (\RuntimeException $e) { return new JSONResponse(['error' => $e->getMessage()], 400); } - } - + }//end create() /** * Update consultation status. @@ -103,8 +98,7 @@ public function updateStatus(string $id): JSONResponse } catch (\RuntimeException $e) { return new JSONResponse(['error' => $e->getMessage()], 400); } - } - + }//end updateStatus() /** * Submit advice response. @@ -124,8 +118,7 @@ public function submitResponse(string $id): JSONResponse } catch (\RuntimeException $e) { return new JSONResponse(['error' => $e->getMessage()], 400); } - } - + }//end submitResponse() /** * Get overdue consultations. @@ -138,5 +131,5 @@ public function overdue(): JSONResponse { $overdue = $this->consultationService->getOverdueConsultations(); return new JSONResponse(['results' => $overdue]); - } -} + }//end overdue() +}//end class diff --git a/lib/Controller/EmailController.php b/lib/Controller/EmailController.php index ce91f223..4099c7d6 100644 --- a/lib/Controller/EmailController.php +++ b/lib/Controller/EmailController.php @@ -31,8 +31,6 @@ */ class EmailController extends Controller { - - /** * Constructor. * @@ -46,8 +44,7 @@ public function __construct( private readonly CaseEmailService $emailService, ) { parent::__construct($appName, $request); - } - + }//end __construct() /** * Send an email from case context. @@ -61,7 +58,7 @@ public function __construct( public function send(string $caseId): JSONResponse { try { - $data = json_decode($this->request->getContent() ?: '{}', true) ?: []; + $data = json_decode($this->request->getContent() ?: '{}', true) ?: []; $result = $this->emailService->sendEmail( $caseId, $data['to'] ?? '', @@ -73,8 +70,7 @@ public function send(string $caseId): JSONResponse } catch (\RuntimeException $e) { return new JSONResponse(['error' => $e->getMessage()], 400); } - } - + }//end send() /** * Send email using a template. @@ -98,8 +94,7 @@ public function sendFromTemplate(string $caseId): JSONResponse } catch (\RuntimeException $e) { return new JSONResponse(['error' => $e->getMessage()], 400); } - } - + }//end sendFromTemplate() /** * Preview a template with case data. @@ -112,18 +107,20 @@ public function sendFromTemplate(string $caseId): JSONResponse */ public function preview(string $caseId): JSONResponse { - $data = json_decode($this->request->getContent() ?: '{}', true) ?: []; - $template = $data['body'] ?? ''; - $caseData = []; // Would load from case. + $data = json_decode($this->request->getContent() ?: '{}', true) ?: []; + $template = $data['body'] ?? ''; + $caseData = []; + // Would load from case. $resolved = $this->emailService->resolveVariables($template, $caseData); $unresolved = $this->emailService->findUnresolvedVariables($template, $caseData); - return new JSONResponse([ - 'resolved' => $resolved, - 'unresolved' => $unresolved, - ]); - } - + return new JSONResponse( + [ + 'resolved' => $resolved, + 'unresolved' => $unresolved, + ] + ); + }//end preview() /** * Get email templates for a case type. @@ -138,5 +135,5 @@ public function templates(string $caseTypeId): JSONResponse { $templates = $this->emailService->getTemplatesForCaseType($caseTypeId); return new JSONResponse(['results' => $templates]); - } -} + }//end templates() +}//end class diff --git a/lib/Controller/InspectionController.php b/lib/Controller/InspectionController.php index 7399f44e..24c8a07c 100644 --- a/lib/Controller/InspectionController.php +++ b/lib/Controller/InspectionController.php @@ -41,12 +41,12 @@ class InspectionController extends Controller /** * Constructor. * - * @param string $appName The app name. - * @param IRequest $request The request object. - * @param InspectionService $inspectionService The inspection service. - * @param ChecklistService $checklistService The checklist service. - * @param IUserSession $userSession The user session. - * @param LoggerInterface $logger The logger. + * @param string $appName The app name. + * @param IRequest $request The request object. + * @param InspectionService $inspectionService The inspection service. + * @param ChecklistService $checklistService The checklist service. + * @param IUserSession $userSession The user session. + * @param LoggerInterface $logger The logger. */ public function __construct( string $appName, @@ -57,7 +57,7 @@ public function __construct( private readonly LoggerInterface $logger, ) { parent::__construct($appName, $request); - } + }//end __construct() /** * List inspections assigned to the current user. @@ -70,20 +70,20 @@ public function index(): JSONResponse { try { $userId = $this->userSession->getUser()?->getUID() ?? ''; - $date = $this->request->getParam('date'); + $date = $this->request->getParam('date'); // In full implementation, query OpenRegister for inspections. $inspections = $this->inspectionService->getInspections($userId, $date, []); return new JSONResponse(['results' => $inspections]); } catch (\Throwable $e) { - $this->logger->error('Failed to list inspections: ' . $e->getMessage()); + $this->logger->error('Failed to list inspections: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Failed to list inspections: ' . $e->getMessage()], + ['error' => 'Failed to list inspections: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); } - } + }//end index() /** * Record GPS location for an inspection. @@ -97,10 +97,10 @@ public function index(): JSONResponse public function captureLocation(string $id): JSONResponse { try { - $body = $this->getRequestBody(); - $latitude = (float)($body['latitude'] ?? 0); - $longitude = (float)($body['longitude'] ?? 0); - $accuracy = (float)($body['accuracy'] ?? 0); + $body = $this->getRequestBody(); + $latitude = (float) ($body['latitude'] ?? 0); + $longitude = (float) ($body['longitude'] ?? 0); + $accuracy = (float) ($body['accuracy'] ?? 0); $inspection = $body['inspection'] ?? []; if ($latitude === 0.0 && $longitude === 0.0) { @@ -119,13 +119,13 @@ public function captureLocation(string $id): JSONResponse return new JSONResponse($result); } catch (\Throwable $e) { - $this->logger->error('Failed to capture location: ' . $e->getMessage()); + $this->logger->error('Failed to capture location: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Failed to capture location: ' . $e->getMessage()], + ['error' => 'Failed to capture location: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } + }//end try + }//end captureLocation() /** * Complete a checklist item. @@ -140,11 +140,11 @@ public function captureLocation(string $id): JSONResponse public function completeChecklistItem(string $id, string $itemId): JSONResponse { try { - $body = $this->getRequestBody(); - $status = $body['status'] ?? ''; + $body = $this->getRequestBody(); + $status = $body['status'] ?? ''; $toelichting = $body['toelichting'] ?? ''; - $photoRefs = $body['photoRefs'] ?? []; - $checklist = $body['checklist'] ?? []; + $photoRefs = $body['photoRefs'] ?? []; + $checklist = $body['checklist'] ?? []; $updatedChecklist = $this->checklistService->completeItem( $checklist, @@ -156,23 +156,25 @@ public function completeChecklistItem(string $id, string $itemId): JSONResponse $progress = $this->checklistService->getProgress($updatedChecklist); - return new JSONResponse([ - 'checklist' => $updatedChecklist, - 'progress' => $progress, - ]); + return new JSONResponse( + [ + 'checklist' => $updatedChecklist, + 'progress' => $progress, + ] + ); } catch (\InvalidArgumentException $e) { return new JSONResponse( ['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST ); } catch (\Throwable $e) { - $this->logger->error('Failed to complete checklist item: ' . $e->getMessage()); + $this->logger->error('Failed to complete checklist item: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Failed to complete checklist item: ' . $e->getMessage()], + ['error' => 'Failed to complete checklist item: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } + }//end try + }//end completeChecklistItem() /** * Upload a photo for an inspection. @@ -186,21 +188,21 @@ public function completeChecklistItem(string $id, string $itemId): JSONResponse public function addPhoto(string $id): JSONResponse { try { - $body = $this->getRequestBody(); - $inspection = $body['inspection'] ?? []; + $body = $this->getRequestBody(); + $inspection = $body['inspection'] ?? []; $photoMetadata = $body['photoMetadata'] ?? []; $updatedInspection = $this->inspectionService->addPhoto($inspection, $photoMetadata); return new JSONResponse($updatedInspection); } catch (\Throwable $e) { - $this->logger->error('Failed to add photo: ' . $e->getMessage()); + $this->logger->error('Failed to add photo: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Failed to add photo: ' . $e->getMessage()], + ['error' => 'Failed to add photo: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); } - } + }//end addPhoto() /** * Complete an inspection. @@ -214,7 +216,7 @@ public function addPhoto(string $id): JSONResponse public function complete(string $id): JSONResponse { try { - $body = $this->getRequestBody(); + $body = $this->getRequestBody(); $inspection = $body['inspection'] ?? []; $conclusion = $body['conclusion'] ?? ''; @@ -227,13 +229,13 @@ public function complete(string $id): JSONResponse Http::STATUS_BAD_REQUEST ); } catch (\Throwable $e) { - $this->logger->error('Failed to complete inspection: ' . $e->getMessage()); + $this->logger->error('Failed to complete inspection: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Failed to complete inspection: ' . $e->getMessage()], + ['error' => 'Failed to complete inspection: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); } - } + }//end complete() /** * Get the parsed request body. @@ -249,5 +251,5 @@ private function getRequestBody(): array $decoded = json_decode($body, true); return is_array($decoded) ? $decoded : []; - } -} + }//end getRequestBody() +}//end class diff --git a/lib/Controller/LegesController.php b/lib/Controller/LegesController.php index 4930f996..1c3dc494 100644 --- a/lib/Controller/LegesController.php +++ b/lib/Controller/LegesController.php @@ -42,12 +42,12 @@ class LegesController extends Controller /** * Constructor. * - * @param string $appName The app name. - * @param IRequest $request The request object. - * @param LegesCalculationService $calculationService The calculation service. - * @param LegesExportService $exportService The export service. - * @param IUserSession $userSession The user session. - * @param LoggerInterface $logger The logger. + * @param string $appName The app name. + * @param IRequest $request The request object. + * @param LegesCalculationService $calculationService The calculation service. + * @param LegesExportService $exportService The export service. + * @param IUserSession $userSession The user session. + * @param LoggerInterface $logger The logger. */ public function __construct( string $appName, @@ -58,7 +58,7 @@ public function __construct( private readonly LoggerInterface $logger, ) { parent::__construct($appName, $request); - } + }//end __construct() /** * Calculate leges for a case. @@ -70,7 +70,7 @@ public function __construct( public function calculate(): JSONResponse { try { - $caseData = $this->request->getParam('caseData', []); + $caseData = $this->request->getParam('caseData', []); $verordening = $this->request->getParam('verordening', []); if (empty($caseData) || empty($verordening)) { @@ -83,6 +83,7 @@ public function calculate(): JSONResponse if (is_string($caseData)) { $caseData = json_decode($caseData, true) ?? []; } + if (is_string($verordening)) { $verordening = json_decode($verordening, true) ?? []; } @@ -93,13 +94,13 @@ public function calculate(): JSONResponse return new JSONResponse($result); } catch (\Throwable $e) { - $this->logger->error('Leges calculation failed: ' . $e->getMessage()); + $this->logger->error('Leges calculation failed: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Calculation failed: ' . $e->getMessage()], + ['error' => 'Calculation failed: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } + }//end try + }//end calculate() /** * Recalculate leges with corrected data. @@ -111,17 +112,19 @@ public function calculate(): JSONResponse public function recalculate(): JSONResponse { try { - $caseData = $this->request->getParam('caseData', []); - $verordening = $this->request->getParam('verordening', []); + $caseData = $this->request->getParam('caseData', []); + $verordening = $this->request->getParam('verordening', []); $previousCalc = $this->request->getParam('previousCalculation', []); - $reason = $this->request->getParam('correctionReason', ''); + $reason = $this->request->getParam('correctionReason', ''); if (is_string($caseData)) { $caseData = json_decode($caseData, true) ?? []; } + if (is_string($verordening)) { $verordening = json_decode($verordening, true) ?? []; } + if (is_string($previousCalc)) { $previousCalc = json_decode($previousCalc, true) ?? []; } @@ -138,13 +141,13 @@ public function recalculate(): JSONResponse return new JSONResponse($result); } catch (\Throwable $e) { - $this->logger->error('Leges recalculation failed: ' . $e->getMessage()); + $this->logger->error('Leges recalculation failed: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Recalculation failed: ' . $e->getMessage()], + ['error' => 'Recalculation failed: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } + }//end try + }//end recalculate() /** * Calculate verrekening (deduction). @@ -156,20 +159,20 @@ public function recalculate(): JSONResponse public function verrekening(): JSONResponse { try { - $currentAmount = (float)$this->request->getParam('currentAmount', 0); - $previousAmount = (float)$this->request->getParam('previousAmount', 0); + $currentAmount = (float) $this->request->getParam('currentAmount', 0); + $previousAmount = (float) $this->request->getParam('previousAmount', 0); $result = $this->calculationService->calculateVerrekening($currentAmount, $previousAmount); return new JSONResponse($result); } catch (\Throwable $e) { - $this->logger->error('Verrekening calculation failed: ' . $e->getMessage()); + $this->logger->error('Verrekening calculation failed: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Verrekening failed: ' . $e->getMessage()], + ['error' => 'Verrekening failed: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); } - } + }//end verrekening() /** * Calculate teruggaaf (refund). @@ -181,9 +184,9 @@ public function verrekening(): JSONResponse public function teruggaaf(): JSONResponse { try { - $imposedAmount = (float)$this->request->getParam('imposedAmount', 0); - $refundFraction = (float)$this->request->getParam('refundFraction', 1.0); - $reason = (string)$this->request->getParam('reason', ''); + $imposedAmount = (float) $this->request->getParam('imposedAmount', 0); + $refundFraction = (float) $this->request->getParam('refundFraction', 1.0); + $reason = (string) $this->request->getParam('reason', ''); $result = $this->calculationService->calculateTeruggaaf( $imposedAmount, @@ -193,13 +196,13 @@ public function teruggaaf(): JSONResponse return new JSONResponse($result); } catch (\Throwable $e) { - $this->logger->error('Teruggaaf calculation failed: ' . $e->getMessage()); + $this->logger->error('Teruggaaf calculation failed: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Teruggaaf failed: ' . $e->getMessage()], + ['error' => 'Teruggaaf failed: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); } - } + }//end teruggaaf() /** * Export berekeningen to financial system format. @@ -212,7 +215,7 @@ public function export(): DataDownloadResponse|JSONResponse { try { $berekeningen = $this->request->getParam('berekeningen', []); - $format = $this->request->getParam('format', LegesExportService::FORMAT_CSV); + $format = $this->request->getParam('format', LegesExportService::FORMAT_CSV); if (is_string($berekeningen)) { $berekeningen = json_decode($berekeningen, true) ?? []; @@ -238,11 +241,11 @@ public function export(): DataDownloadResponse|JSONResponse Http::STATUS_BAD_REQUEST ); } catch (\Throwable $e) { - $this->logger->error('Leges export failed: ' . $e->getMessage()); + $this->logger->error('Leges export failed: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Export failed: ' . $e->getMessage()], + ['error' => 'Export failed: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } -} + }//end try + }//end export() +}//end class diff --git a/lib/Controller/MetricsController.php b/lib/Controller/MetricsController.php index de693618..ed658a2e 100644 --- a/lib/Controller/MetricsController.php +++ b/lib/Controller/MetricsController.php @@ -109,9 +109,13 @@ private function collectMetrics(): string // Cases total by status and case_type. $lines[] = '# HELP procest_cases_total Total cases by status and case_type'; $lines[] = '# TYPE procest_cases_total gauge'; - $caseCounts = $this->getCached('procest_metrics_case_counts', self::CACHE_TTL_DEFAULT, function () { - return $this->getCaseCounts(); - }); + $caseCounts = $this->getCached( + 'procest_metrics_case_counts', + self::CACHE_TTL_DEFAULT, + function () { + return $this->getCaseCounts(); + } + ); foreach ($caseCounts as $row) { $status = $this->sanitizeLabel(value: $row['status']); $caseType = $this->sanitizeLabel(value: $row['case_type']); @@ -122,29 +126,41 @@ private function collectMetrics(): string $lines[] = ''; // Cases overdue total. - $overdueCount = $this->getCached('procest_metrics_overdue_cases', self::CACHE_TTL_OVERDUE, function () { - return $this->getOverdueCasesCount(); - }); - $lines[] = '# HELP procest_cases_overdue_total Cases past their deadline'; - $lines[] = '# TYPE procest_cases_overdue_total gauge'; - $lines[] = 'procest_cases_overdue_total '.$overdueCount; - $lines[] = ''; + $overdueCount = $this->getCached( + 'procest_metrics_overdue_cases', + self::CACHE_TTL_OVERDUE, + function () { + return $this->getOverdueCasesCount(); + } + ); + $lines[] = '# HELP procest_cases_overdue_total Cases past their deadline'; + $lines[] = '# TYPE procest_cases_overdue_total gauge'; + $lines[] = 'procest_cases_overdue_total '.$overdueCount; + $lines[] = ''; // Cases created today. - $createdToday = $this->getCached('procest_metrics_created_today', self::CACHE_TTL_DEFAULT, function () { - return $this->getCasesCreatedTodayCount(); - }); - $lines[] = '# HELP procest_cases_created_today Cases created today'; - $lines[] = '# TYPE procest_cases_created_today gauge'; - $lines[] = 'procest_cases_created_today '.$createdToday; - $lines[] = ''; + $createdToday = $this->getCached( + 'procest_metrics_created_today', + self::CACHE_TTL_DEFAULT, + function () { + return $this->getCasesCreatedTodayCount(); + } + ); + $lines[] = '# HELP procest_cases_created_today Cases created today'; + $lines[] = '# TYPE procest_cases_created_today gauge'; + $lines[] = 'procest_cases_created_today '.$createdToday; + $lines[] = ''; // Tasks total by status. $lines[] = '# HELP procest_tasks_total Total tasks by status'; $lines[] = '# TYPE procest_tasks_total gauge'; - $taskCounts = $this->getCached('procest_metrics_task_counts', self::CACHE_TTL_DEFAULT, function () { - return $this->getTaskCounts(); - }); + $taskCounts = $this->getCached( + 'procest_metrics_task_counts', + self::CACHE_TTL_DEFAULT, + function () { + return $this->getTaskCounts(); + } + ); foreach ($taskCounts as $row) { $status = $this->sanitizeLabel(value: $row['status']); $count = (int) $row['cnt']; @@ -154,13 +170,17 @@ private function collectMetrics(): string $lines[] = ''; // Tasks overdue total. - $overdueTasksCount = $this->getCached('procest_metrics_overdue_tasks', self::CACHE_TTL_OVERDUE, function () { - return $this->getOverdueTasksCount(); - }); - $lines[] = '# HELP procest_tasks_overdue_total Tasks past their deadline'; - $lines[] = '# TYPE procest_tasks_overdue_total gauge'; - $lines[] = 'procest_tasks_overdue_total '.$overdueTasksCount; - $lines[] = ''; + $overdueTasksCount = $this->getCached( + 'procest_metrics_overdue_tasks', + self::CACHE_TTL_OVERDUE, + function () { + return $this->getOverdueTasksCount(); + } + ); + $lines[] = '# HELP procest_tasks_overdue_total Tasks past their deadline'; + $lines[] = '# TYPE procest_tasks_overdue_total gauge'; + $lines[] = 'procest_tasks_overdue_total '.$overdueTasksCount; + $lines[] = ''; return implode("\n", $lines)."\n"; }//end collectMetrics() diff --git a/lib/Controller/MilestoneController.php b/lib/Controller/MilestoneController.php index 80456aad..1eb00d78 100644 --- a/lib/Controller/MilestoneController.php +++ b/lib/Controller/MilestoneController.php @@ -32,8 +32,6 @@ */ class MilestoneController extends Controller { - - /** * Constructor. * @@ -49,8 +47,7 @@ public function __construct( private readonly IUserSession $userSession, ) { parent::__construct($appName, $request); - } - + }//end __construct() /** * Get milestone progress for a case. @@ -70,8 +67,7 @@ public function progress(string $caseId, string $caseTypeId): JSONResponse } catch (\RuntimeException $e) { return new JSONResponse(['error' => $e->getMessage()], 500); } - } - + }//end progress() /** * Mark a milestone as reached. @@ -99,8 +95,7 @@ public function mark(string $caseId, string $milestoneId): JSONResponse } catch (\RuntimeException $e) { return new JSONResponse(['error' => $e->getMessage()], 400); } - } - + }//end mark() /** * Reverse a milestone. @@ -136,5 +131,5 @@ public function reverse(string $caseId, string $milestoneId): JSONResponse } catch (\RuntimeException $e) { return new JSONResponse(['error' => $e->getMessage()], 400); } - } -} + }//end reverse() +}//end class diff --git a/lib/Controller/ParaferingController.php b/lib/Controller/ParaferingController.php index a0477e3b..d2fd9983 100644 --- a/lib/Controller/ParaferingController.php +++ b/lib/Controller/ParaferingController.php @@ -40,11 +40,11 @@ class ParaferingController extends Controller /** * Constructor. * - * @param string $appName The app name. - * @param IRequest $request The request object. - * @param ParaferingService $paraferingService The parafering service. - * @param IUserSession $userSession The user session. - * @param LoggerInterface $logger The logger. + * @param string $appName The app name. + * @param IRequest $request The request object. + * @param ParaferingService $paraferingService The parafering service. + * @param IUserSession $userSession The user session. + * @param LoggerInterface $logger The logger. */ public function __construct( string $appName, @@ -54,7 +54,7 @@ public function __construct( private readonly LoggerInterface $logger, ) { parent::__construct($appName, $request); - } + }//end __construct() /** * Create a new voorstel. @@ -66,7 +66,7 @@ public function __construct( public function createVoorstel(): JSONResponse { try { - $data = $this->getRequestBody(); + $data = $this->getRequestBody(); $userId = $this->userSession->getUser()?->getUID() ?? 'system'; if (empty($data['caseId'])) { @@ -77,17 +77,17 @@ public function createVoorstel(): JSONResponse } $data['steller'] = $data['steller'] ?? $userId; - $voorstel = $this->paraferingService->createVoorstel($data); + $voorstel = $this->paraferingService->createVoorstel($data); return new JSONResponse($voorstel, Http::STATUS_CREATED); } catch (\Throwable $e) { - $this->logger->error('Failed to create voorstel: ' . $e->getMessage()); + $this->logger->error('Failed to create voorstel: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Failed to create voorstel: ' . $e->getMessage()], + ['error' => 'Failed to create voorstel: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } + }//end try + }//end createVoorstel() /** * Start parafering on a voorstel. @@ -101,9 +101,9 @@ public function createVoorstel(): JSONResponse public function startParafering(string $id): JSONResponse { try { - $data = $this->getRequestBody(); + $data = $this->getRequestBody(); $voorstel = $data['voorstel'] ?? []; - $route = $data['route'] ?? []; + $route = $data['route'] ?? []; if (empty($voorstel) || empty($route)) { return new JSONResponse( @@ -121,13 +121,13 @@ public function startParafering(string $id): JSONResponse Http::STATUS_BAD_REQUEST ); } catch (\Throwable $e) { - $this->logger->error('Failed to start parafering: ' . $e->getMessage()); + $this->logger->error('Failed to start parafering: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Failed to start parafering: ' . $e->getMessage()], + ['error' => 'Failed to start parafering: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } + }//end try + }//end startParafering() /** * Execute a parafering action (paraferen). @@ -141,7 +141,7 @@ public function startParafering(string $id): JSONResponse public function paraferen(string $id): JSONResponse { return $this->handleAction($id, ParaferingService::ACTION_PARAFEREN); - } + }//end paraferen() /** * Execute a terugsturen action. @@ -155,7 +155,7 @@ public function paraferen(string $id): JSONResponse public function terugsturen(string $id): JSONResponse { return $this->handleAction($id, ParaferingService::ACTION_TERUGSTUREN); - } + }//end terugsturen() /** * Execute an adviseren action. @@ -169,7 +169,7 @@ public function terugsturen(string $id): JSONResponse public function adviseren(string $id): JSONResponse { return $this->handleAction($id, ParaferingService::ACTION_ADVISEREN); - } + }//end adviseren() /** * Get the audit trail for a voorstel. @@ -183,20 +183,20 @@ public function adviseren(string $id): JSONResponse public function auditTrail(string $id): JSONResponse { try { - $data = $this->getRequestBody(); + $data = $this->getRequestBody(); $voorstel = $data['voorstel'] ?? []; $trail = $this->paraferingService->getAuditTrail($voorstel); return new JSONResponse(['auditTrail' => $trail]); } catch (\Throwable $e) { - $this->logger->error('Failed to get audit trail: ' . $e->getMessage()); + $this->logger->error('Failed to get audit trail: '.$e->getMessage()); return new JSONResponse( - ['error' => 'Failed to get audit trail: ' . $e->getMessage()], + ['error' => 'Failed to get audit trail: '.$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); } - } + }//end auditTrail() /** * Handle a parafering action. @@ -209,10 +209,10 @@ public function auditTrail(string $id): JSONResponse private function handleAction(string $id, string $action): JSONResponse { try { - $data = $this->getRequestBody(); + $data = $this->getRequestBody(); $voorstel = $data['voorstel'] ?? []; - $comment = $data['comment'] ?? ''; - $namens = $data['namens'] ?? null; + $comment = $data['comment'] ?? ''; + $namens = $data['namens'] ?? null; $userId = $this->userSession->getUser()?->getUID() ?? 'system'; @@ -231,13 +231,13 @@ private function handleAction(string $id, string $action): JSONResponse Http::STATUS_BAD_REQUEST ); } catch (\Throwable $e) { - $this->logger->error("Failed to execute {$action}: " . $e->getMessage()); + $this->logger->error("Failed to execute {$action}: ".$e->getMessage()); return new JSONResponse( - ['error' => "Failed to execute {$action}: " . $e->getMessage()], + ['error' => "Failed to execute {$action}: ".$e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR ); - } - } + }//end try + }//end handleAction() /** * Get the parsed request body. @@ -253,5 +253,5 @@ private function getRequestBody(): array $decoded = json_decode($body, true); return is_array($decoded) ? $decoded : []; - } -} + }//end getRequestBody() +}//end class diff --git a/lib/Controller/PublicAppointmentController.php b/lib/Controller/PublicAppointmentController.php index 9aa2c3fb..b700c80f 100644 --- a/lib/Controller/PublicAppointmentController.php +++ b/lib/Controller/PublicAppointmentController.php @@ -17,7 +17,7 @@ public function __construct( private AppointmentService $appointmentService, ) { parent::__construct(appName: Application::APP_ID, request: $request); - } + }//end __construct() /** * @PublicPage @@ -30,17 +30,19 @@ public function view(string $token): JSONResponse return new JSONResponse(['error' => 'Afspraak niet gevonden'], 404); } - return new JSONResponse([ - 'success' => true, - 'appointment' => [ - 'dateTime' => $appointment['dateTime'] ?? null, - 'duration' => $appointment['duration'] ?? 30, - 'status' => $appointment['status'] ?? 'scheduled', - 'locationId' => $appointment['locationId'] ?? null, - 'productId' => $appointment['productId'] ?? null, - ], - ]); - } + return new JSONResponse( + [ + 'success' => true, + 'appointment' => [ + 'dateTime' => $appointment['dateTime'] ?? null, + 'duration' => $appointment['duration'] ?? 30, + 'status' => $appointment['status'] ?? 'scheduled', + 'locationId' => $appointment['locationId'] ?? null, + 'productId' => $appointment['productId'] ?? null, + ], + ] + ); + }//end view() /** * @PublicPage @@ -60,5 +62,5 @@ public function cancel(string $token): JSONResponse $id = $appointment['uuid'] ?? $appointment['id'] ?? ''; $result = $this->appointmentService->cancelAppointment($id); return new JSONResponse(['success' => true, 'appointment' => $result]); - } -} + }//end cancel() +}//end class diff --git a/lib/Controller/PublicShareController.php b/lib/Controller/PublicShareController.php index df10140c..0f3df9d9 100644 --- a/lib/Controller/PublicShareController.php +++ b/lib/Controller/PublicShareController.php @@ -46,7 +46,7 @@ class PublicShareController extends Controller * @param CaseSharingService $caseSharingService The sharing service * @param SettingsService $settingsService The settings service * @param IAppManager $appManager The app manager - * @param ContainerInterface $container The DI container + * @param ContainerInterface $container The DI container * @param LoggerInterface $logger The logger * * @return void @@ -118,16 +118,18 @@ public function accessShare(string $token): JSONResponse ] ); - return new JSONResponse([ - 'success' => true, - 'case' => $filteredData, - 'permissionLevel' => $shareData['permissionLevel'], - 'canComment' => in_array( + return new JSONResponse( + [ + 'success' => true, + 'case' => $filteredData, + 'permissionLevel' => $shareData['permissionLevel'], + 'canComment' => in_array( $shareData['permissionLevel'], ['bekijken_reageren', 'bekijken_bijdragen'] ), - 'canUpload' => $shareData['permissionLevel'] === 'bekijken_bijdragen', - ]); + 'canUpload' => $shareData['permissionLevel'] === 'bekijken_bijdragen', + ] + ); }//end accessShare() /** @@ -185,10 +187,12 @@ public function addComment(string $token): JSONResponse ] ); - return new JSONResponse([ - 'success' => true, - 'message' => 'Reactie toegevoegd', - ]); + return new JSONResponse( + [ + 'success' => true, + 'message' => 'Reactie toegevoegd', + ] + ); }//end addComment() /** @@ -226,11 +230,11 @@ public function viewStatus(string $token): JSONResponse // Return only citizen-safe status information. $statusData = [ - 'title' => ($caseData['title'] ?? ''), - 'identifier' => ($caseData['identifier'] ?? ''), - 'currentStatus' => ($caseData['status'] ?? ''), - 'plannedEndDate' => ($caseData['plannedEndDate'] ?? null), - 'startDate' => ($caseData['startDate'] ?? null), + 'title' => ($caseData['title'] ?? ''), + 'identifier' => ($caseData['identifier'] ?? ''), + 'currentStatus' => ($caseData['status'] ?? ''), + 'plannedEndDate' => ($caseData['plannedEndDate'] ?? null), + 'startDate' => ($caseData['startDate'] ?? null), ]; return new JSONResponse(['success' => true, 'status' => $statusData]); @@ -270,6 +274,6 @@ private function loadCaseData(string $caseId): ?array ] ); return null; - } + }//end try }//end loadCaseData() }//end class diff --git a/lib/Controller/StufController.php b/lib/Controller/StufController.php index 30b7d596..8976d89c 100644 --- a/lib/Controller/StufController.php +++ b/lib/Controller/StufController.php @@ -51,7 +51,7 @@ class StufController extends Controller */ private const DEFAULT_ZENDER = [ 'organisatie' => 'Procest', - 'applicatie' => 'Procest', + 'applicatie' => 'Procest', ]; /** @@ -71,7 +71,7 @@ public function __construct( private readonly LoggerInterface $logger, ) { parent::__construct($appName, $request); - } + }//end __construct() /** * Handle inbound StUF-ZKN SOAP messages for case operations. @@ -83,7 +83,7 @@ public function __construct( public function zaken(): DataDisplayResponse { return $this->handleSoapMessage('zaken'); - } + }//end zaken() /** * Handle inbound StUF-BG SOAP messages for person operations. @@ -95,7 +95,7 @@ public function zaken(): DataDisplayResponse public function personen(): DataDisplayResponse { return $this->handleSoapMessage('personen'); - } + }//end personen() /** * Handle an inbound SOAP message. @@ -117,11 +117,11 @@ private function handleSoapMessage(string $service): DataDisplayResponse $dom = new \DOMDocument(); libxml_use_internal_errors(true); $parseResult = $dom->loadXML($rawBody); - $errors = libxml_get_errors(); + $errors = libxml_get_errors(); libxml_clear_errors(); if (!$parseResult || !empty($errors)) { - $this->logger->warning('Invalid XML received at StUF endpoint: ' . $service); + $this->logger->warning('Invalid XML received at StUF endpoint: '.$service); $response = $this->messageBuilder->buildSoapFault('Ongeldig XML bericht'); return $this->soapResponse($response, Http::STATUS_BAD_REQUEST); } @@ -172,7 +172,7 @@ private function handleSoapMessage(string $service): DataDisplayResponse 'edcLk01' => $this->handleEdcLk01($messageElement), default => $this->handleUnknownMessage($messageType), }; - } + }//end handleSoapMessage() /** * Handle zakLk01 (case create/update) message. @@ -196,20 +196,23 @@ private function handleZakLk01(\DOMElement $message): DataDisplayResponse return $this->soapResponse($response); } - $objectEl = $objectElements->item(0); + $objectEl = $objectElements->item(0); $mutatiesoort = $message->getAttribute('mutatiesoort'); // Extract basic fields. - $stufFields = $this->extractFields($objectEl, [ - 'identificatie', - 'omschrijving', - 'toelichting', - 'startdatum', - 'einddatum', - 'einddatumGepland', - 'uiterlijkeEinddatumAfdoening', - 'vertrouwelijkAanduiding', - ]); + $stufFields = $this->extractFields( + $objectEl, + [ + 'identificatie', + 'omschrijving', + 'toelichting', + 'startdatum', + 'einddatum', + 'einddatumGepland', + 'uiterlijkeEinddatumAfdoening', + 'vertrouwelijkAanduiding', + ] + ); // Map to internal properties. $internalData = $this->mappingService->mapZknToInternal($stufFields); @@ -218,13 +221,13 @@ private function handleZakLk01(\DOMElement $message): DataDisplayResponse 'Processed zakLk01 mutatiesoort={mutatiesoort}, identifier={id}', [ 'mutatiesoort' => $mutatiesoort, - 'id' => $internalData['identifier'] ?? 'none', + 'id' => $internalData['identifier'] ?? 'none', ] ); // Extract referentienummer for cross-reference. $stuurgegevens = $message->getElementsByTagName('stuurgegevens'); - $crossRef = ''; + $crossRef = ''; if ($stuurgegevens->length > 0) { $refElements = $stuurgegevens->item(0)->getElementsByTagName('referentienummer'); if ($refElements->length > 0) { @@ -241,7 +244,7 @@ private function handleZakLk01(\DOMElement $message): DataDisplayResponse ); return $this->soapResponse($response); - } + }//end handleZakLk01() /** * Handle zakLv01 (case query) message. @@ -254,15 +257,18 @@ private function handleZakLv01(\DOMElement $message): DataDisplayResponse { // Extract query criteria from gelijk element. $gelijkElements = $message->getElementsByTagName('gelijk'); - $criteria = []; + $criteria = []; if ($gelijkElements->length > 0) { - $gelijk = $gelijkElements->item(0); - $criteria = $this->extractFields($gelijk, [ - 'identificatie', - 'omschrijving', - 'startdatum', - ]); + $gelijk = $gelijkElements->item(0); + $criteria = $this->extractFields( + $gelijk, + [ + 'identificatie', + 'omschrijving', + 'startdatum', + ] + ); } $this->logger->info( @@ -272,8 +278,8 @@ private function handleZakLv01(\DOMElement $message): DataDisplayResponse // In a full implementation, query OpenRegister and build zakLa01 response. // For now, return an empty zakLa01 response. - $body = ''; + $body = ''; $body .= $this->messageBuilder->buildStuurgegevens(self::DEFAULT_ZENDER, []); $body .= ''; $body .= ''; @@ -281,7 +287,7 @@ private function handleZakLv01(\DOMElement $message): DataDisplayResponse $response = $this->messageBuilder->buildSoapEnvelope($body); return $this->soapResponse($response); - } + }//end handleZakLv01() /** * Handle npsLv01 (person query) message. @@ -294,7 +300,7 @@ private function handleNpsLv01(\DOMElement $message): DataDisplayResponse { // Extract BSN from gelijk element. $gelijkElements = $message->getElementsByTagName('gelijk'); - $bsn = ''; + $bsn = ''; if ($gelijkElements->length > 0) { $bsnElements = $gelijkElements->item(0)->getElementsByTagName('bsn'); @@ -305,13 +311,13 @@ private function handleNpsLv01(\DOMElement $message): DataDisplayResponse $this->logger->info( 'Processed npsLv01 person query for BSN {bsn}', - ['bsn' => substr($bsn, 0, 3) . '***'] + ['bsn' => substr($bsn, 0, 3).'***'] ); // In a full implementation, query OpenRegister for person data. // For now, return an empty npsLa01 response. - $body = ''; + $body = ''; $body .= $this->messageBuilder->buildStuurgegevens(self::DEFAULT_ZENDER, []); $body .= ''; $body .= ''; @@ -319,7 +325,7 @@ private function handleNpsLv01(\DOMElement $message): DataDisplayResponse $response = $this->messageBuilder->buildSoapEnvelope($body); return $this->soapResponse($response); - } + }//end handleNpsLv01() /** * Handle edcLk01 (document create/update) message. @@ -334,7 +340,7 @@ private function handleEdcLk01(\DOMElement $message): DataDisplayResponse // Extract referentienummer. $stuurgegevens = $message->getElementsByTagName('stuurgegevens'); - $crossRef = ''; + $crossRef = ''; if ($stuurgegevens->length > 0) { $refElements = $stuurgegevens->item(0)->getElementsByTagName('referentienummer'); if ($refElements->length > 0) { @@ -349,7 +355,7 @@ private function handleEdcLk01(\DOMElement $message): DataDisplayResponse ); return $this->soapResponse($response); - } + }//end handleEdcLk01() /** * Handle unknown message type. @@ -360,18 +366,18 @@ private function handleEdcLk01(\DOMElement $message): DataDisplayResponse */ private function handleUnknownMessage(string $messageType): DataDisplayResponse { - $this->logger->warning('Unknown StUF message type: ' . $messageType); + $this->logger->warning('Unknown StUF message type: '.$messageType); $response = $this->messageBuilder->buildFo01( 'StUF001', - 'Onbekend berichttype: ' . $messageType, + 'Onbekend berichttype: '.$messageType, 'server', self::DEFAULT_ZENDER, [] ); return $this->soapResponse($response, Http::STATUS_BAD_REQUEST); - } + }//end handleUnknownMessage() /** * Extract field values from a DOM element. @@ -397,7 +403,7 @@ private function extractFields(?\DOMElement $element, array $fieldNames): array } return $result; - } + }//end extractFields() /** * Create a SOAP XML response. @@ -407,10 +413,10 @@ private function extractFields(?\DOMElement $element, array $fieldNames): array * * @return DataDisplayResponse */ - private function soapResponse(string $xml, int $statusCode = Http::STATUS_OK): DataDisplayResponse + private function soapResponse(string $xml, int $statusCode=Http::STATUS_OK): DataDisplayResponse { $response = new DataDisplayResponse($xml, $statusCode); $response->addHeader('Content-Type', 'text/xml; charset=utf-8'); return $response; - } -} + }//end soapResponse() +}//end class diff --git a/lib/Controller/TemplateController.php b/lib/Controller/TemplateController.php index c6e68a38..e8fd7d6c 100644 --- a/lib/Controller/TemplateController.php +++ b/lib/Controller/TemplateController.php @@ -32,8 +32,6 @@ */ class TemplateController extends Controller { - - /** * Constructor. * @@ -49,8 +47,7 @@ public function __construct( private readonly LoggerInterface $logger, ) { parent::__construct($appName, $request); - } - + }//end __construct() /** * List all available templates. @@ -63,8 +60,7 @@ public function index(): JSONResponse { $templates = $this->templateService->listTemplates(); return new JSONResponse(['results' => $templates]); - } - + }//end index() /** * Get a single template by ID. @@ -83,8 +79,7 @@ public function show(string $id): JSONResponse } return new JSONResponse($template); - } - + }//end show() /** * Activate a template (create all objects from it). @@ -106,5 +101,5 @@ public function activate(string $id): JSONResponse 400, ); } - } -} + }//end activate() +}//end class diff --git a/lib/Middleware/TenantMiddleware.php b/lib/Middleware/TenantMiddleware.php index 799cada2..b53109e9 100644 --- a/lib/Middleware/TenantMiddleware.php +++ b/lib/Middleware/TenantMiddleware.php @@ -51,10 +51,10 @@ class TenantMiddleware extends Middleware /** * Constructor for the TenantMiddleware. * - * @param TenantService $tenantService The tenant service - * @param IUserSession $userSession The user session - * @param IRequest $request The request object - * @param LoggerInterface $logger The logger + * @param TenantService $tenantService The tenant service + * @param IUserSession $userSession The user session + * @param IRequest $request The request object + * @param LoggerInterface $logger The logger * * @return void */ @@ -69,8 +69,8 @@ public function __construct( /** * Check tenant context before controller execution. * - * @param \OCP\AppFramework\Controller $controller The controller - * @param string $methodName The method name + * @param \OCP\AppFramework\Controller $controller The controller + * @param string $methodName The method name * * @return void * @@ -117,9 +117,9 @@ public function beforeController($controller, $methodName): void /** * Handle exceptions from controllers. * - * @param \OCP\AppFramework\Controller $controller The controller - * @param string $methodName The method name - * @param \Exception $exception The exception + * @param \OCP\AppFramework\Controller $controller The controller + * @param string $methodName The method name + * @param \Exception $exception The exception * * @return JSONResponse The error response * diff --git a/lib/Service/AiService.php b/lib/Service/AiService.php index 738fca52..f1be0299 100644 --- a/lib/Service/AiService.php +++ b/lib/Service/AiService.php @@ -55,9 +55,9 @@ class AiService /** * Constructor for AiService. * - * @param IAppConfig $appConfig The app configuration service - * @param ContainerInterface $container The DI container - * @param LoggerInterface $logger The logger interface + * @param IAppConfig $appConfig The app configuration service + * @param ContainerInterface $container The DI container + * @param LoggerInterface $logger The logger interface * * @return void */ @@ -133,19 +133,21 @@ public function classifyDocument(string $caseId, string $documentId, string $use $responseTimeMs = (int) ((microtime(true) - $startTime) * 1000); - $this->recordAuditEntry([ - 'type' => 'classification', - 'action' => 'suggested', - 'caseId' => $caseId, - 'documentId' => $documentId, - 'model' => $this->getModelIdentifier(), - 'prompt' => $prompt, - 'suggestion' => $result, - 'confidence' => ($result['confidence'] ?? 0.0), - 'userId' => $userId, - 'timestamp' => date('c'), - 'responseTimeMs' => $responseTimeMs, - ]); + $this->recordAuditEntry( + [ + 'type' => 'classification', + 'action' => 'suggested', + 'caseId' => $caseId, + 'documentId' => $documentId, + 'model' => $this->getModelIdentifier(), + 'prompt' => $prompt, + 'suggestion' => $result, + 'confidence' => ($result['confidence'] ?? 0.0), + 'userId' => $userId, + 'timestamp' => date('c'), + 'responseTimeMs' => $responseTimeMs, + ] + ); return [ 'success' => true, @@ -191,19 +193,21 @@ public function extractData(string $caseId, ?string $documentId, string $userId) $responseTimeMs = (int) ((microtime(true) - $startTime) * 1000); - $this->recordAuditEntry([ - 'type' => 'extraction', - 'action' => 'suggested', - 'caseId' => $caseId, - 'documentId' => ($documentId ?? ''), - 'model' => $this->getModelIdentifier(), - 'prompt' => $prompt, - 'suggestion' => $result, - 'confidence' => ($result['averageConfidence'] ?? 0.0), - 'userId' => $userId, - 'timestamp' => date('c'), - 'responseTimeMs' => $responseTimeMs, - ]); + $this->recordAuditEntry( + [ + 'type' => 'extraction', + 'action' => 'suggested', + 'caseId' => $caseId, + 'documentId' => ($documentId ?? ''), + 'model' => $this->getModelIdentifier(), + 'prompt' => $prompt, + 'suggestion' => $result, + 'confidence' => ($result['averageConfidence'] ?? 0.0), + 'userId' => $userId, + 'timestamp' => date('c'), + 'responseTimeMs' => $responseTimeMs, + ] + ); return [ 'success' => true, @@ -248,18 +252,20 @@ public function askQuestion(string $caseId, string $question, string $userId): a $responseTimeMs = (int) ((microtime(true) - $startTime) * 1000); - $this->recordAuditEntry([ - 'type' => 'qa', - 'action' => 'suggested', - 'caseId' => $caseId, - 'model' => $this->getModelIdentifier(), - 'prompt' => $question, - 'suggestion' => $result, - 'confidence' => ($result['confidence'] ?? 0.0), - 'userId' => $userId, - 'timestamp' => date('c'), - 'responseTimeMs' => $responseTimeMs, - ]); + $this->recordAuditEntry( + [ + 'type' => 'qa', + 'action' => 'suggested', + 'caseId' => $caseId, + 'model' => $this->getModelIdentifier(), + 'prompt' => $question, + 'suggestion' => $result, + 'confidence' => ($result['confidence'] ?? 0.0), + 'userId' => $userId, + 'timestamp' => date('c'), + 'responseTimeMs' => $responseTimeMs, + ] + ); return [ 'success' => true, @@ -307,18 +313,20 @@ public function summarize(string $caseId, string $type, ?string $documentId, str $responseTimeMs = (int) ((microtime(true) - $startTime) * 1000); - $this->recordAuditEntry([ - 'type' => 'summary', - 'action' => 'suggested', - 'caseId' => $caseId, - 'documentId' => ($documentId ?? ''), - 'model' => $this->getModelIdentifier(), - 'prompt' => $prompt, - 'suggestion' => ['summary' => ($result['summary'] ?? '')], - 'userId' => $userId, - 'timestamp' => date('c'), - 'responseTimeMs' => $responseTimeMs, - ]); + $this->recordAuditEntry( + [ + 'type' => 'summary', + 'action' => 'suggested', + 'caseId' => $caseId, + 'documentId' => ($documentId ?? ''), + 'model' => $this->getModelIdentifier(), + 'prompt' => $prompt, + 'suggestion' => ['summary' => ($result['summary'] ?? '')], + 'userId' => $userId, + 'timestamp' => date('c'), + 'responseTimeMs' => $responseTimeMs, + ] + ); return [ 'success' => true, @@ -362,18 +370,20 @@ public function suggestRouting(string $caseId, string $userId): array $responseTimeMs = (int) ((microtime(true) - $startTime) * 1000); - $this->recordAuditEntry([ - 'type' => 'routing', - 'action' => 'suggested', - 'caseId' => $caseId, - 'model' => $this->getModelIdentifier(), - 'prompt' => $prompt, - 'suggestion' => $result, - 'confidence' => ($result['confidence'] ?? 0.0), - 'userId' => $userId, - 'timestamp' => date('c'), - 'responseTimeMs' => $responseTimeMs, - ]); + $this->recordAuditEntry( + [ + 'type' => 'routing', + 'action' => 'suggested', + 'caseId' => $caseId, + 'model' => $this->getModelIdentifier(), + 'prompt' => $prompt, + 'suggestion' => $result, + 'confidence' => ($result['confidence'] ?? 0.0), + 'userId' => $userId, + 'timestamp' => date('c'), + 'responseTimeMs' => $responseTimeMs, + ] + ); return [ 'success' => true, @@ -417,17 +427,19 @@ public function suggestNextStep(string $caseId, string $userId): array $responseTimeMs = (int) ((microtime(true) - $startTime) * 1000); - $this->recordAuditEntry([ - 'type' => 'decision_support', - 'action' => 'suggested', - 'caseId' => $caseId, - 'model' => $this->getModelIdentifier(), - 'prompt' => $prompt, - 'suggestion' => $result, - 'userId' => $userId, - 'timestamp' => date('c'), - 'responseTimeMs' => $responseTimeMs, - ]); + $this->recordAuditEntry( + [ + 'type' => 'decision_support', + 'action' => 'suggested', + 'caseId' => $caseId, + 'model' => $this->getModelIdentifier(), + 'prompt' => $prompt, + 'suggestion' => $result, + 'userId' => $userId, + 'timestamp' => date('c'), + 'responseTimeMs' => $responseTimeMs, + ] + ); return [ 'success' => true, @@ -469,18 +481,20 @@ public function recordUserAction( ?string $reason, string $userId, ): array { - $this->recordAuditEntry([ - 'type' => $type, - 'action' => $userAction, - 'caseId' => $caseId, - 'model' => $this->getModelIdentifier(), - 'suggestion' => $suggestion, - 'userAction' => $userAction, - 'actualValue' => ($actualValue ?? []), - 'reason' => ($reason ?? ''), - 'userId' => $userId, - 'timestamp' => date('c'), - ]); + $this->recordAuditEntry( + [ + 'type' => $type, + 'action' => $userAction, + 'caseId' => $caseId, + 'model' => $this->getModelIdentifier(), + 'suggestion' => $suggestion, + 'userAction' => $userAction, + 'actualValue' => ($actualValue ?? []), + 'reason' => ($reason ?? ''), + 'userId' => $userId, + 'timestamp' => date('c'), + ] + ); return ['success' => true]; }//end recordUserAction() @@ -524,19 +538,19 @@ public function testHealth(): array public function getAiSettings(): array { return [ - 'ai_enabled' => $this->appConfig->getValueString(Application::APP_ID, 'ai_enabled', ''), - 'ai_model_type' => $this->appConfig->getValueString(Application::APP_ID, 'ai_model_type', 'local'), - 'ai_model_url' => $this->appConfig->getValueString(Application::APP_ID, 'ai_model_url', ''), - 'ai_model_name' => $this->appConfig->getValueString(Application::APP_ID, 'ai_model_name', ''), - 'ai_api_key_set' => $this->appConfig->getValueString(Application::APP_ID, 'ai_api_key', '') !== '', - 'ai_feature_classification' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_classification', ''), - 'ai_feature_extraction' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_extraction', ''), - 'ai_feature_qa' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_qa', ''), - 'ai_feature_summary' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_summary', ''), - 'ai_feature_routing' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_routing', ''), - 'ai_feature_decision_support' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_decision_support', ''), - 'ai_dpia_acknowledged' => $this->appConfig->getValueString(Application::APP_ID, 'ai_dpia_acknowledged', ''), - 'ai_pii_stripping' => $this->appConfig->getValueString(Application::APP_ID, 'ai_pii_stripping', '1'), + 'ai_enabled' => $this->appConfig->getValueString(Application::APP_ID, 'ai_enabled', ''), + 'ai_model_type' => $this->appConfig->getValueString(Application::APP_ID, 'ai_model_type', 'local'), + 'ai_model_url' => $this->appConfig->getValueString(Application::APP_ID, 'ai_model_url', ''), + 'ai_model_name' => $this->appConfig->getValueString(Application::APP_ID, 'ai_model_name', ''), + 'ai_api_key_set' => $this->appConfig->getValueString(Application::APP_ID, 'ai_api_key', '') !== '', + 'ai_feature_classification' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_classification', ''), + 'ai_feature_extraction' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_extraction', ''), + 'ai_feature_qa' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_qa', ''), + 'ai_feature_summary' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_summary', ''), + 'ai_feature_routing' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_routing', ''), + 'ai_feature_decision_support' => $this->appConfig->getValueString(Application::APP_ID, 'ai_feature_decision_support', ''), + 'ai_dpia_acknowledged' => $this->appConfig->getValueString(Application::APP_ID, 'ai_dpia_acknowledged', ''), + 'ai_pii_stripping' => $this->appConfig->getValueString(Application::APP_ID, 'ai_pii_stripping', '1'), ]; }//end getAiSettings() @@ -616,12 +630,14 @@ private function callAiModel(string $prompt): array ); // Build the request payload for Ollama-compatible API. - $payload = json_encode([ - 'model' => $modelName, - 'prompt' => $prompt, - 'stream' => false, - 'format' => 'json', - ]); + $payload = json_encode( + [ + 'model' => $modelName, + 'prompt' => $prompt, + 'stream' => false, + 'format' => 'json', + ] + ); $endpoint = rtrim($modelUrl, '/').'/api/generate'; @@ -640,10 +656,14 @@ private function callAiModel(string $prompt): array '' ); if (empty($apiKey) === false) { - curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Content-Type: application/json', - 'Authorization: Bearer '.$apiKey, - ]); + curl_setopt( + $ch, + CURLOPT_HTTPHEADER, + [ + 'Content-Type: application/json', + 'Authorization: Bearer '.$apiKey, + ] + ); } } @@ -696,7 +716,7 @@ private function recordAuditEntry(array $entry): void 'register', '' ); - $schemaId = $this->appConfig->getValueString( + $schemaId = $this->appConfig->getValueString( Application::APP_ID, 'ai_audit_entry_schema', '' @@ -717,7 +737,7 @@ private function recordAuditEntry(array $entry): void 'Failed to record AI audit entry', ['error' => $e->getMessage()] ); - } + }//end try }//end recordAuditEntry() /** diff --git a/lib/Service/AppointmentBackend/JccBackend.php b/lib/Service/AppointmentBackend/JccBackend.php index e080ea08..360fdc92 100644 --- a/lib/Service/AppointmentBackend/JccBackend.php +++ b/lib/Service/AppointmentBackend/JccBackend.php @@ -21,7 +21,7 @@ public function __construct( private string $apiUrl, private string $apiKey, ) { - } + }//end __construct() public function getTimeslots(string $productId, string $locationId, string $date): array { @@ -44,7 +44,7 @@ public function getTimeslots(string $productId, string $locationId, string $date $this->logger->error('JCC API error: '.$e->getMessage()); return []; } - } + }//end getTimeslots() public function bookAppointment(array $data): array { @@ -63,7 +63,7 @@ public function bookAppointment(array $data): array $this->logger->error('JCC booking error: '.$e->getMessage()); return ['error' => $e->getMessage()]; } - } + }//end bookAppointment() public function cancelAppointment(string $externalId): bool { @@ -78,11 +78,11 @@ public function cancelAppointment(string $externalId): bool $this->logger->error('JCC cancel error: '.$e->getMessage()); return false; } - } + }//end cancelAppointment() public function rescheduleAppointment(string $externalId, string $newDateTime): array { $this->cancelAppointment($externalId); return $this->bookAppointment(['dateTime' => $newDateTime, 'externalId' => $externalId]); - } -} + }//end rescheduleAppointment() +}//end class diff --git a/lib/Service/AppointmentBackend/LocalBackend.php b/lib/Service/AppointmentBackend/LocalBackend.php index 889dd6e6..591dd056 100644 --- a/lib/Service/AppointmentBackend/LocalBackend.php +++ b/lib/Service/AppointmentBackend/LocalBackend.php @@ -21,7 +21,7 @@ class LocalBackend implements AppointmentBackendInterface public function __construct( private LoggerInterface $logger, ) { - } + }//end __construct() public function getTimeslots(string $productId, string $locationId, string $date): array { @@ -38,21 +38,21 @@ public function getTimeslots(string $productId, string $locationId, string $date } return $slots; - } + }//end getTimeslots() public function bookAppointment(array $data): array { return ['externalId' => 'local-'.bin2hex(random_bytes(8))]; - } + }//end bookAppointment() public function cancelAppointment(string $externalId): bool { $this->logger->info('Local backend: appointment cancelled', ['externalId' => $externalId]); return true; - } + }//end cancelAppointment() public function rescheduleAppointment(string $externalId, string $newDateTime): array { return ['externalId' => $externalId]; - } -} + }//end rescheduleAppointment() +}//end class diff --git a/lib/Service/AppointmentBackend/QmaticBackend.php b/lib/Service/AppointmentBackend/QmaticBackend.php index f975199b..24a1428c 100644 --- a/lib/Service/AppointmentBackend/QmaticBackend.php +++ b/lib/Service/AppointmentBackend/QmaticBackend.php @@ -18,7 +18,7 @@ public function __construct( private string $apiUrl, private string $apiKey, ) { - } + }//end __construct() public function getTimeslots(string $productId, string $locationId, string $date): array { @@ -38,12 +38,13 @@ public function getTimeslots(string $productId, string $locationId, string $date 'available' => true, ]; } + return $slots; } catch (\Exception $e) { $this->logger->error('Qmatic API error: '.$e->getMessage()); return []; - } - } + }//end try + }//end getTimeslots() public function bookAppointment(array $data): array { @@ -62,7 +63,7 @@ public function bookAppointment(array $data): array $this->logger->error('Qmatic booking error: '.$e->getMessage()); return ['error' => $e->getMessage()]; } - } + }//end bookAppointment() public function cancelAppointment(string $externalId): bool { @@ -77,11 +78,11 @@ public function cancelAppointment(string $externalId): bool $this->logger->error('Qmatic cancel error: '.$e->getMessage()); return false; } - } + }//end cancelAppointment() public function rescheduleAppointment(string $externalId, string $newDateTime): array { $this->cancelAppointment($externalId); return $this->bookAppointment(['dateTime' => $newDateTime]); - } -} + }//end rescheduleAppointment() +}//end class diff --git a/lib/Service/AppointmentService.php b/lib/Service/AppointmentService.php index 0cc8793f..a15a7735 100644 --- a/lib/Service/AppointmentService.php +++ b/lib/Service/AppointmentService.php @@ -28,7 +28,7 @@ public function __construct( private ContainerInterface $container, private LoggerInterface $logger, ) { - } + }//end __construct() /** * Get available timeslots via the configured backend. @@ -36,7 +36,7 @@ public function __construct( public function getTimeslots(string $productId, string $locationId, string $date): array { return $this->getBackend()->getTimeslots($productId, $locationId, $date); - } + }//end getTimeslots() /** * Book an appointment linked to a case. @@ -55,13 +55,16 @@ public function bookAppointment(string $caseId, array $data): array $register = $this->settingsService->getConfigValue('register'); $schema = $this->settingsService->getConfigValue('appointment_schema'); - $appointmentData = array_merge($data, [ - 'caseId' => $caseId, - 'status' => 'scheduled', - 'externalId' => $backendResult['externalId'] ?? null, - 'cancelToken' => bin2hex(random_bytes(16)), - 'reminderSent' => false, - ]); + $appointmentData = array_merge( + $data, + [ + 'caseId' => $caseId, + 'status' => 'scheduled', + 'externalId' => $backendResult['externalId'] ?? null, + 'cancelToken' => bin2hex(random_bytes(16)), + 'reminderSent' => false, + ] + ); $result = $objectService->saveObject( (int) $register, @@ -69,13 +72,16 @@ public function bookAppointment(string $caseId, array $data): array $appointmentData, ); - $this->logger->info('Procest: Appointment booked', [ - 'caseId' => $caseId, - 'appointmentId' => $result->getUuid(), - ]); + $this->logger->info( + 'Procest: Appointment booked', + [ + 'caseId' => $caseId, + 'appointmentId' => $result->getUuid(), + ] + ); return $result->jsonSerialize(); - } + }//end bookAppointment() /** * Cancel an appointment. @@ -99,10 +105,10 @@ public function cancelAppointment(string $appointmentId): array } $data['status'] = 'cancelled'; - $result = $objectService->saveObject((int) $register, (int) $schema, $data); + $result = $objectService->saveObject((int) $register, (int) $schema, $data); return $result->jsonSerialize(); - } + }//end cancelAppointment() /** * Mark an appointment as no-show. @@ -117,13 +123,13 @@ public function markNoShow(string $appointmentId): array $register = $this->settingsService->getConfigValue('register'); $schema = $this->settingsService->getConfigValue('appointment_schema'); - $appointment = $objectService->getObject((int) $register, (int) $schema, $appointmentId); - $data = $appointment->jsonSerialize(); + $appointment = $objectService->getObject((int) $register, (int) $schema, $appointmentId); + $data = $appointment->jsonSerialize(); $data['status'] = 'no_show'; $result = $objectService->saveObject((int) $register, (int) $schema, $data); return $result->jsonSerialize(); - } + }//end markNoShow() /** * Get appointments for a case. @@ -145,7 +151,7 @@ public function getAppointmentsForCase(string $caseId): array ); return $result['objects'] ?? []; - } + }//end getAppointmentsForCase() /** * Validate cancel token and return appointment. @@ -173,7 +179,7 @@ public function getAppointmentByToken(string $token): ?array $apt = reset($appointments); return is_object($apt) ? $apt->jsonSerialize() : $apt; - } + }//end getAppointmentByToken() /** * Get the configured appointment backend. @@ -192,7 +198,7 @@ private function getBackend(): AppointmentBackendInterface default: return new LocalBackend($this->logger); } - } + }//end getBackend() private function getObjectService(): ?\OCA\OpenRegister\Service\ObjectService { @@ -206,5 +212,5 @@ private function getObjectService(): ?\OCA\OpenRegister\Service\ObjectService $this->logger->error('Procest: Could not get ObjectService', ['exception' => $e->getMessage()]); return null; } - } -} + }//end getObjectService() +}//end class diff --git a/lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php b/lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php index 03562880..a74f2f02 100644 --- a/lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php +++ b/lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php @@ -25,7 +25,7 @@ public function sendMessage( string $subject, string $body, string $typeCode, - ?string $attachment = null, + ?string $attachment=null, ): array; /** @@ -36,4 +36,4 @@ public function sendMessage( * @return array Status with read (bool), readAt (datetime|null) */ public function getReadStatus(string $messageId): array; -} +}//end interface diff --git a/lib/Service/BerichtenboxAdapter/MockAdapter.php b/lib/Service/BerichtenboxAdapter/MockAdapter.php index 4d5a902c..78abf3ef 100644 --- a/lib/Service/BerichtenboxAdapter/MockAdapter.php +++ b/lib/Service/BerichtenboxAdapter/MockAdapter.php @@ -16,31 +16,34 @@ class MockAdapter implements BerichtenboxAdapterInterface public function __construct( private LoggerInterface $logger, ) { - } + }//end __construct() public function sendMessage( string $bsn, string $subject, string $body, string $typeCode, - ?string $attachment = null, + ?string $attachment=null, ): array { $messageId = 'mock-'.bin2hex(random_bytes(8)); - $this->logger->info('MockBerichtenbox: Message sent', [ - 'messageId' => $messageId, - 'bsn' => substr($bsn, 0, 4).'*****', - 'subject' => $subject, - 'typeCode' => $typeCode, - 'hasAttachment' => $attachment !== null, - ]); + $this->logger->info( + 'MockBerichtenbox: Message sent', + [ + 'messageId' => $messageId, + 'bsn' => substr($bsn, 0, 4).'*****', + 'subject' => $subject, + 'typeCode' => $typeCode, + 'hasAttachment' => $attachment !== null, + ] + ); return [ 'messageId' => $messageId, 'status' => 'sent', 'sentAt' => (new \DateTime())->format('c'), ]; - } + }//end sendMessage() public function getReadStatus(string $messageId): array { @@ -49,5 +52,5 @@ public function getReadStatus(string $messageId): array 'read' => true, 'readAt' => (new \DateTime('-1 hour'))->format('c'), ]; - } -} + }//end getReadStatus() +}//end class diff --git a/lib/Service/BerichtenboxService.php b/lib/Service/BerichtenboxService.php index 5865b8cf..eedd9318 100644 --- a/lib/Service/BerichtenboxService.php +++ b/lib/Service/BerichtenboxService.php @@ -15,15 +15,15 @@ */ class BerichtenboxService { - private const MAX_ATTACHMENT_SIZE = 10485760; // 10 MB - + private const MAX_ATTACHMENT_SIZE = 10485760; + // 10 MB public function __construct( private SettingsService $settingsService, private IAppManager $appManager, private ContainerInterface $container, private LoggerInterface $logger, ) { - } + }//end __construct() /** * Send a message to the Berichtenbox. @@ -34,7 +34,7 @@ public function sendMessage( string $subject, string $body, string $typeCode, - ?string $attachmentFileId = null, + ?string $attachmentFileId=null, ): array { // Validate inputs. $errors = $this->validateMessage($bsn, $subject, $body); @@ -51,7 +51,8 @@ public function sendMessage( $attachmentContent = null; if ($attachmentFileId !== null) { // Attachment validation would check file size here. - $attachmentContent = ''; // Placeholder -- actual file reading via IRootFolder. + $attachmentContent = ''; + // Placeholder -- actual file reading via IRootFolder. } // Send via adapter. @@ -80,13 +81,16 @@ public function sendMessage( $messageData, ); - $this->logger->info('Procest: Berichtenbox message sent', [ - 'caseId' => $caseId, - 'messageId' => $result['messageId'] ?? '', - ]); + $this->logger->info( + 'Procest: Berichtenbox message sent', + [ + 'caseId' => $caseId, + 'messageId' => $result['messageId'] ?? '', + ] + ); return $saved->jsonSerialize(); - } + }//end sendMessage() /** * Get sent messages for a case. @@ -108,7 +112,7 @@ public function getMessagesForCase(string $caseId): array ); return $result['objects'] ?? []; - } + }//end getMessagesForCase() /** * Poll read status for a message. @@ -154,7 +158,7 @@ public function pollReadStatus(string $messageId): array } return $data; - } + }//end pollReadStatus() /** * Validate a BSN using the 11-proef. @@ -169,10 +173,11 @@ public function validateBsn(string $bsn): bool for ($i = 0; $i < 8; $i++) { $sum += (int) $bsn[$i] * (9 - $i); } + $sum -= (int) $bsn[8]; return ($sum % 11) === 0 && $sum !== 0; - } + }//end validateBsn() /** * Validate message inputs. @@ -183,7 +188,7 @@ private function validateMessage(string $bsn, string $subject, string $body): ar if (empty($bsn) === true) { $errors[] = 'BSN is verplicht voor berichten via Mijn Overheid'; - } elseif ($this->validateBsn($bsn) === false) { + } else if ($this->validateBsn($bsn) === false) { $errors[] = 'Ongeldig BSN-nummer'; } @@ -201,13 +206,13 @@ private function validateMessage(string $bsn, string $subject, string $body): ar } return $errors; - } + }//end validateMessage() private function getAdapter(): BerichtenboxAdapterInterface { // For MVP, always use mock adapter. return new MockAdapter($this->logger); - } + }//end getAdapter() private function getObjectService(): ?\OCA\OpenRegister\Service\ObjectService { @@ -221,5 +226,5 @@ private function getObjectService(): ?\OCA\OpenRegister\Service\ObjectService $this->logger->error('Procest: Could not get ObjectService', ['exception' => $e->getMessage()]); return null; } - } -} + }//end getObjectService() +}//end class diff --git a/lib/Service/CaseDefinitionExportService.php b/lib/Service/CaseDefinitionExportService.php index da39db06..22ca3f67 100644 --- a/lib/Service/CaseDefinitionExportService.php +++ b/lib/Service/CaseDefinitionExportService.php @@ -65,7 +65,7 @@ public function __construct( private readonly IAppConfig $appConfig, private readonly LoggerInterface $logger, ) { - } + }//end __construct() /** * Export a case definition as a ZIP archive. @@ -81,7 +81,7 @@ public function __construct( */ public function exportCaseDefinition( string $caseTypeId, - array $components = [], + array $components=[], ): array { if (empty($components)) { $components = self::COMPONENTS; @@ -91,7 +91,7 @@ public function exportCaseDefinition( $invalidComponents = array_diff($components, self::COMPONENTS); if (!empty($invalidComponents)) { throw new \InvalidArgumentException( - 'Invalid export components: ' . implode(', ', $invalidComponents) + 'Invalid export components: '.implode(', ', $invalidComponents) ); } @@ -112,10 +112,10 @@ public function exportCaseDefinition( throw new \RuntimeException('Failed to create temporary file for export'); } - $zip = new \ZipArchive(); + $zip = new \ZipArchive(); $result = $zip->open($tempPath, \ZipArchive::CREATE | \ZipArchive::OVERWRITE); if ($result !== true) { - throw new \RuntimeException('Failed to create ZIP archive: error code ' . $result); + throw new \RuntimeException('Failed to create ZIP archive: error code '.$result); } // Add manifest. @@ -125,17 +125,17 @@ public function exportCaseDefinition( foreach ($components as $component) { $data = $this->exportComponent($caseTypeId, $component); if ($data !== null) { - $filename = $component === 'workflows' ? 'workflows/' : $component . '.json'; + $filename = $component === 'workflows' ? 'workflows/' : $component.'.json'; if ($component === 'workflows' && is_array($data)) { foreach ($data as $workflowName => $workflowData) { $zip->addFromString( - 'workflows/' . $workflowName . '.json', + 'workflows/'.$workflowName.'.json', json_encode($workflowData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) ); } } else { $zip->addFromString( - $component . '.json', + $component.'.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) ); } @@ -144,14 +144,14 @@ public function exportCaseDefinition( $zip->close(); - $slug = $manifest['caseType']['slug'] ?? 'unknown'; + $slug = $manifest['caseType']['slug'] ?? 'unknown'; $version = $manifest['version'] ?? '1.0'; return [ - 'path' => $tempPath, + 'path' => $tempPath, 'filename' => "case-definition-{$slug}-v{$version}.zip", ]; - } + }//end exportCaseDefinition() /** * Build the manifest for a case definition export. @@ -165,7 +165,7 @@ private function buildManifest(string $caseTypeId, array $components): array { $previousVersion = $this->appConfig->getValueString( Application::APP_ID, - 'export_version_' . $caseTypeId, + 'export_version_'.$caseTypeId, '0.0' ); @@ -174,35 +174,35 @@ private function buildManifest(string $caseTypeId, array $components): array // Store the new version. $this->appConfig->setValueString( Application::APP_ID, - 'export_version_' . $caseTypeId, + 'export_version_'.$caseTypeId, $newVersion ); $excludedComponents = array_values(array_diff(self::COMPONENTS, $components)); return [ - 'version' => $newVersion, - 'previousVersion' => $previousVersion !== '0.0' ? $previousVersion : null, - 'exportDate' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), - 'sourceEnvironment' => $this->appConfig->getValueString( + 'version' => $newVersion, + 'previousVersion' => $previousVersion !== '0.0' ? $previousVersion : null, + 'exportDate' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), + 'sourceEnvironment' => $this->appConfig->getValueString( Application::APP_ID, 'environment_name', 'unknown' ), - 'generator' => 'procest/' . $this->appConfig->getValueString( + 'generator' => 'procest/'.$this->appConfig->getValueString( 'procest', 'installed_version', 'unknown' ), - 'caseType' => [ - 'id' => $caseTypeId, + 'caseType' => [ + 'id' => $caseTypeId, 'slug' => $caseTypeId, ], - 'components' => $components, + 'components' => $components, 'excludedComponents' => $excludedComponents, - 'dependencies' => [], + 'dependencies' => [], ]; - } + }//end buildManifest() /** * Export a single component. @@ -219,8 +219,8 @@ private function exportComponent(string $caseTypeId, string $component): ?array // demonstrate the expected format. return match ($component) { 'schema' => [ - 'caseTypeId' => $caseTypeId, - 'fields' => [], + 'caseTypeId' => $caseTypeId, + 'fields' => [], 'validations' => [], ], 'statuses' => [ @@ -233,16 +233,16 @@ private function exportComponent(string $caseTypeId, string $component): ?array ], 'documents' => [ 'documentTypes' => [], - 'templates' => [], + 'templates' => [], ], 'metadata' => [ - 'resultTypes' => [], + 'resultTypes' => [], 'decisionTypes' => [], ], 'workflows' => [], default => null, - }; - } + };//end match + }//end exportComponent() /** * Increment a version string (e.g., "1.0" -> "1.1"). @@ -254,9 +254,9 @@ private function exportComponent(string $caseTypeId, string $component): ?array private function incrementVersion(string $version): string { $parts = explode('.', $version); - $major = (int)($parts[0] ?? 1); - $minor = (int)($parts[1] ?? 0); + $major = (int) ($parts[0] ?? 1); + $minor = (int) ($parts[1] ?? 0); return sprintf(self::VERSION_FORMAT, $major, $minor + 1); - } -} + }//end incrementVersion() +}//end class diff --git a/lib/Service/CaseDefinitionImportService.php b/lib/Service/CaseDefinitionImportService.php index 1d731fc2..3a7c13aa 100644 --- a/lib/Service/CaseDefinitionImportService.php +++ b/lib/Service/CaseDefinitionImportService.php @@ -66,7 +66,7 @@ public function __construct( private readonly IAppConfig $appConfig, private readonly LoggerInterface $logger, ) { - } + }//end __construct() /** * Validate a case definition package without importing it. @@ -80,26 +80,26 @@ public function __construct( public function validatePackage(string $zipPath): array { $result = [ - 'valid' => true, - 'errors' => [], - 'warnings' => [], - 'manifest' => null, + 'valid' => true, + 'errors' => [], + 'warnings' => [], + 'manifest' => null, 'conflicts' => [], ]; // Open the ZIP. - $zip = new \ZipArchive(); + $zip = new \ZipArchive(); $openResult = $zip->open($zipPath, \ZipArchive::RDONLY); if ($openResult !== true) { - $result['valid'] = false; - $result['errors'][] = 'Failed to open ZIP archive: error code ' . $openResult; + $result['valid'] = false; + $result['errors'][] = 'Failed to open ZIP archive: error code '.$openResult; return $result; } // Check required files. foreach (self::REQUIRED_FILES as $requiredFile) { if ($zip->locateName($requiredFile) === false) { - $result['valid'] = false; + $result['valid'] = false; $result['errors'][] = "Missing required file: {$requiredFile}"; } } @@ -112,7 +112,7 @@ public function validatePackage(string $zipPath): array // Parse manifest. $manifestJson = $zip->getFromName('manifest.json'); if ($manifestJson === false) { - $result['valid'] = false; + $result['valid'] = false; $result['errors'][] = 'Failed to read manifest.json'; $zip->close(); return $result; @@ -120,8 +120,8 @@ public function validatePackage(string $zipPath): array $manifest = json_decode($manifestJson, true); if ($manifest === null) { - $result['valid'] = false; - $result['errors'][] = 'Invalid JSON in manifest.json: ' . json_last_error_msg(); + $result['valid'] = false; + $result['errors'][] = 'Invalid JSON in manifest.json: '.json_last_error_msg(); $zip->close(); return $result; } @@ -132,7 +132,7 @@ public function validatePackage(string $zipPath): array $requiredManifestFields = ['version', 'exportDate', 'caseType', 'components']; foreach ($requiredManifestFields as $field) { if (!isset($manifest[$field])) { - $result['valid'] = false; + $result['valid'] = false; $result['errors'][] = "Missing required manifest field: {$field}"; } } @@ -150,30 +150,32 @@ public function validatePackage(string $zipPath): array break; } } + if (!$hasWorkflows) { $result['warnings'][] = 'Component "workflows" declared but no workflow files found'; } } else { - $componentFile = $component . '.json'; + $componentFile = $component.'.json'; if ($zip->locateName($componentFile) === false) { - $result['valid'] = false; + $result['valid'] = false; $result['errors'][] = "Component '{$component}' declared in manifest but file '{$componentFile}' not found"; } - } - } + }//end if + }//end foreach // Validate component JSON. foreach ($components as $component) { if ($component === 'workflows') { continue; } - $componentFile = $component . '.json'; - $content = $zip->getFromName($componentFile); + + $componentFile = $component.'.json'; + $content = $zip->getFromName($componentFile); if ($content !== false) { $decoded = json_decode($content, true); if ($decoded === null && json_last_error() !== JSON_ERROR_NONE) { - $result['valid'] = false; - $result['errors'][] = "Invalid JSON in {$componentFile}: " . json_last_error_msg(); + $result['valid'] = false; + $result['errors'][] = "Invalid JSON in {$componentFile}: ".json_last_error_msg(); } } } @@ -192,20 +194,20 @@ public function validatePackage(string $zipPath): array $this->logger->info( 'Validated case definition package: {valid}, errors: {errorCount}, warnings: {warningCount}', [ - 'valid' => $result['valid'] ? 'true' : 'false', - 'errorCount' => count($result['errors']), + 'valid' => $result['valid'] ? 'true' : 'false', + 'errorCount' => count($result['errors']), 'warningCount' => count($result['warnings']), ] ); return $result; - } + }//end validatePackage() /** * Import a case definition package. * - * @param string $zipPath Path to the uploaded ZIP file. - * @param string $strategy Conflict resolution strategy: 'skip', 'overwrite', or 'merge'. + * @param string $zipPath Path to the uploaded ZIP file. + * @param string $strategy Conflict resolution strategy: 'skip', 'overwrite', or 'merge'. * * @return array{success: bool, message: string, components: array} * @@ -215,21 +217,21 @@ public function validatePackage(string $zipPath): array */ public function importCaseDefinition( string $zipPath, - string $strategy = 'skip', + string $strategy='skip', ): array { // First validate. $validation = $this->validatePackage($zipPath); if (!$validation['valid']) { return [ - 'success' => false, - 'message' => 'Package validation failed: ' . implode('; ', $validation['errors']), + 'success' => false, + 'message' => 'Package validation failed: '.implode('; ', $validation['errors']), 'components' => [], ]; } - $manifest = $validation['manifest']; + $manifest = $validation['manifest']; $components = $manifest['components'] ?? []; - $results = []; + $results = []; $zip = new \ZipArchive(); $zip->open($zipPath, \ZipArchive::RDONLY); @@ -239,14 +241,14 @@ public function importCaseDefinition( $results[$component] = $this->importComponent($zip, $component, $strategy); } catch (\Throwable $e) { $results[$component] = [ - 'status' => 'error', + 'status' => 'error', 'message' => $e->getMessage(), ]; $this->logger->error( 'Failed to import component {component}: {error}', [ 'component' => $component, - 'error' => $e->getMessage(), + 'error' => $e->getMessage(), ] ); } @@ -260,16 +262,16 @@ public function importCaseDefinition( 'Case definition import completed: {success}, components: {count}', [ 'success' => $allSuccess ? 'true' : 'false', - 'count' => count($results), + 'count' => count($results), ] ); return [ - 'success' => $allSuccess, - 'message' => $allSuccess ? 'Import completed successfully' : 'Import completed with errors', + 'success' => $allSuccess, + 'message' => $allSuccess ? 'Import completed successfully' : 'Import completed with errors', 'components' => $results, ]; - } + }//end importCaseDefinition() /** * Import a single component from the ZIP archive. @@ -289,10 +291,10 @@ private function importComponent( return $this->importWorkflows($zip, $strategy); } - $content = $zip->getFromName($component . '.json'); + $content = $zip->getFromName($component.'.json'); if ($content === false) { return [ - 'status' => 'skipped', + 'status' => 'skipped', 'message' => "Component file {$component}.json not found in archive", ]; } @@ -300,7 +302,7 @@ private function importComponent( $data = json_decode($content, true); if ($data === null) { return [ - 'status' => 'error', + 'status' => 'error', 'message' => "Invalid JSON in {$component}.json", ]; } @@ -311,15 +313,15 @@ private function importComponent( 'Imported component {component} with strategy {strategy}', [ 'component' => $component, - 'strategy' => $strategy, + 'strategy' => $strategy, ] ); return [ - 'status' => 'success', + 'status' => 'success', 'message' => "Component '{$component}' imported successfully", ]; - } + }//end importComponent() /** * Import workflow files from the ZIP archive. @@ -345,8 +347,8 @@ private function importWorkflows(\ZipArchive $zip, string $strategy): array } return [ - 'status' => 'success', + 'status' => 'success', 'message' => "Imported {$workflowCount} workflow(s)", ]; - } -} + }//end importWorkflows() +}//end class diff --git a/lib/Service/CaseEmailService.php b/lib/Service/CaseEmailService.php index 86e4e024..0b41a863 100644 --- a/lib/Service/CaseEmailService.php +++ b/lib/Service/CaseEmailService.php @@ -39,7 +39,6 @@ class CaseEmailService */ private const CASE_NUMBER_PATTERN = '/\[ZAAK-(\d{4}-\d{4,})\]/'; - /** * Constructor. * @@ -54,17 +53,16 @@ public function __construct( private readonly IConfig $config, private readonly LoggerInterface $logger, ) { - } - + }//end __construct() /** * Send an email from case context. * - * @param string $caseId The case UUID - * @param string $to Recipient email address - * @param string $subject Email subject - * @param string $body Email body (HTML or plain text) - * @param array $attachments File paths to attach + * @param string $caseId The case UUID + * @param string $to Recipient email address + * @param string $subject Email subject + * @param string $body Email body (HTML or plain text) + * @param array $attachments File paths to attach * * @return array Send result with message ID * @@ -75,14 +73,14 @@ public function sendEmail( string $to, string $subject, string $body, - array $attachments = [], + array $attachments=[], ): array { $fromAddress = $this->config->getAppValue( Application::APP_ID, 'email_from_address', 'noreply@example.nl', ); - $fromName = $this->config->getAppValue( + $fromName = $this->config->getAppValue( Application::APP_ID, 'email_from_name', 'Procest', @@ -106,17 +104,17 @@ public function sendEmail( $this->mailer->send($message); } catch (\Exception $e) { $this->logger->error( - 'Failed to send email for case ' . $caseId . ': ' . $e->getMessage(), + 'Failed to send email for case '.$caseId.': '.$e->getMessage(), ['app' => Application::APP_ID], ); - throw new \RuntimeException('Email sending failed: ' . $e->getMessage()); + throw new \RuntimeException('Email sending failed: '.$e->getMessage()); } // Record the sent email as a case document. $messageId = $this->recordSentEmail($caseId, $to, $subject, $body); $this->logger->info( - 'Email sent for case ' . $caseId . ' to ' . $to, + 'Email sent for case '.$caseId.' to '.$to, ['app' => Application::APP_ID], ); @@ -126,8 +124,7 @@ public function sendEmail( 'subject' => $subject, 'sentAt' => date('Y-m-d\TH:i:s'), ]; - } - + }//end sendEmail() /** * Send an email using a template. @@ -158,8 +155,7 @@ public function sendFromTemplate( $body = $this->resolveVariables($template['body'] ?? '', $caseData); return $this->sendEmail($caseId, $to, $subject, $body); - } - + }//end sendFromTemplate() /** * Resolve template variables in a string. @@ -180,12 +176,13 @@ static function (array $matches) use ($data): string { if (isset($data[$key]) === true && is_scalar($data[$key]) === true) { return (string) $data[$key]; } - return $matches[0]; // Leave unresolved variables as-is. + + return $matches[0]; + // Leave unresolved variables as-is. }, $template, ) ?? $template; - } - + }//end resolveVariables() /** * Find unresolved variables in a template string. @@ -207,8 +204,7 @@ public function findUnresolvedVariables(string $template, array $data): array } return array_unique($unresolved); - } - + }//end findUnresolvedVariables() /** * Extract case number from email subject. @@ -224,16 +220,15 @@ public function extractCaseNumber(string $subject): ?string } return null; - } - + }//end extractCaseNumber() /** * Process an inbound email and link it to a case. * - * @param string $from Sender email address - * @param string $to Recipient email address - * @param string $subject Email subject - * @param string $body Email body + * @param string $from Sender email address + * @param string $to Recipient email address + * @param string $subject Email subject + * @param string $body Email body * @param string $inReplyTo In-Reply-To header (for threading) * * @return array Processing result @@ -243,7 +238,7 @@ public function processInbound( string $to, string $subject, string $body, - string $inReplyTo = '', + string $inReplyTo='', ): array { $caseNumber = $this->extractCaseNumber($subject); @@ -260,7 +255,7 @@ public function processInbound( ); $this->logger->info( - 'Inbound email auto-linked to case ' . $caseId, + 'Inbound email auto-linked to case '.$caseId, ['app' => Application::APP_ID], ); @@ -270,19 +265,18 @@ public function processInbound( 'messageId' => $messageId, 'method' => 'auto', ]; - } - } + }//end if + }//end if // Could not auto-link; add to unlinked queue. return [ - 'linked' => false, - 'caseNumber' => $caseNumber, - 'from' => $from, - 'subject' => $subject, - 'method' => 'unlinked', + 'linked' => false, + 'caseNumber' => $caseNumber, + 'from' => $from, + 'subject' => $subject, + 'method' => 'unlinked', ]; - } - + }//end processInbound() /** * Get email templates for a case type. @@ -314,8 +308,7 @@ public function getTemplatesForCaseType(string $caseTypeId): array ); return is_array($results) ? $results : []; - } - + }//end getTemplatesForCaseType() /** * Load an email template. @@ -340,8 +333,7 @@ private function loadTemplate(string $templateId): ?array $result = $objectService->getObject($register, $schema, $templateId); return is_array($result) ? $result : null; - } - + }//end loadTemplate() /** * Load case data for template variable resolution. @@ -367,15 +359,14 @@ private function loadCaseData(string $caseId): array // Flatten for variable resolution. return [ - 'zaakNummer' => $caseObj['identifier'] ?? '', - 'titel' => $caseObj['title'] ?? '', - 'startdatum' => $caseObj['startDate'] ?? '', - 'deadline' => $caseObj['deadline'] ?? '', - 'status' => $caseObj['status'] ?? '', - 'behandelaar' => $caseObj['assignee'] ?? '', + 'zaakNummer' => $caseObj['identifier'] ?? '', + 'titel' => $caseObj['title'] ?? '', + 'startdatum' => $caseObj['startDate'] ?? '', + 'deadline' => $caseObj['deadline'] ?? '', + 'status' => $caseObj['status'] ?? '', + 'behandelaar' => $caseObj['assignee'] ?? '', ]; - } - + }//end loadCaseData() /** * Record a sent email as a case document. @@ -394,7 +385,7 @@ private function recordSentEmail( string $body, ): string { // Store as activity on the case. - $messageId = 'msg-' . uniqid(); + $messageId = 'msg-'.uniqid(); $objectService = $this->settingsService->getObjectService(); if ($objectService === null) { @@ -405,21 +396,24 @@ private function recordSentEmail( $schema = $this->settingsService->getConfigValue('email_message_schema'); if (empty($register) === false && empty($schema) === false) { - $objectService->saveObject($register, $schema, [ - 'case' => $caseId, - 'direction' => 'outbound', - 'from' => $this->config->getAppValue(Application::APP_ID, 'email_from_address', ''), - 'to' => $to, - 'subject' => $subject, - 'body' => $body, - 'messageId' => $messageId, - 'sentAt' => date('Y-m-d\TH:i:s'), - ]); + $objectService->saveObject( + $register, + $schema, + [ + 'case' => $caseId, + 'direction' => 'outbound', + 'from' => $this->config->getAppValue(Application::APP_ID, 'email_from_address', ''), + 'to' => $to, + 'subject' => $subject, + 'body' => $body, + 'messageId' => $messageId, + 'sentAt' => date('Y-m-d\TH:i:s'), + ] + ); } return $messageId; - } - + }//end recordSentEmail() /** * Record a received email. @@ -439,7 +433,7 @@ private function recordReceivedEmail( string $body, string $inReplyTo, ): string { - $messageId = 'msg-' . uniqid(); + $messageId = 'msg-'.uniqid(); $objectService = $this->settingsService->getObjectService(); if ($objectService === null) { @@ -450,22 +444,25 @@ private function recordReceivedEmail( $schema = $this->settingsService->getConfigValue('email_message_schema'); if (empty($register) === false && empty($schema) === false) { - $objectService->saveObject($register, $schema, [ - 'case' => $caseId, - 'direction' => 'inbound', - 'from' => $from, - 'to' => '', - 'subject' => $subject, - 'body' => $body, - 'messageId' => $messageId, - 'inReplyTo' => $inReplyTo, - 'receivedAt' => date('Y-m-d\TH:i:s'), - ]); + $objectService->saveObject( + $register, + $schema, + [ + 'case' => $caseId, + 'direction' => 'inbound', + 'from' => $from, + 'to' => '', + 'subject' => $subject, + 'body' => $body, + 'messageId' => $messageId, + 'inReplyTo' => $inReplyTo, + 'receivedAt' => date('Y-m-d\TH:i:s'), + ] + ); } return $messageId; - } - + }//end recordReceivedEmail() /** * Find a case by its identifier. @@ -497,5 +494,5 @@ private function findCaseByIdentifier(string $identifier): ?string } return null; - } -} + }//end findCaseByIdentifier() +}//end class diff --git a/lib/Service/CaseSharingService.php b/lib/Service/CaseSharingService.php index 586c5b1e..7db843a6 100644 --- a/lib/Service/CaseSharingService.php +++ b/lib/Service/CaseSharingService.php @@ -60,8 +60,8 @@ class CaseSharingService * * @param SettingsService $settingsService The settings service * @param IAppManager $appManager The app manager - * @param ContainerInterface $container The DI container - * @param LoggerInterface $logger The logger + * @param ContainerInterface $container The DI container + * @param LoggerInterface $logger The logger * * @return void */ @@ -246,7 +246,7 @@ static function ($share) { /** * Revoke a share by marking it with revocation timestamp. * - * @param string $shareId The UUID of the share to revoke + * @param string $shareId The UUID of the share to revoke * @param string $revokedBy The user ID of the revoker * * @return array The updated share data @@ -267,7 +267,7 @@ public function revokeShare(string $shareId, string $revokedBy): array $shareId, ); - $shareData = $share->jsonSerialize(); + $shareData = $share->jsonSerialize(); $shareData['revokedAt'] = (new \DateTime())->format('c'); $shareData['revokedBy'] = $revokedBy; @@ -441,9 +441,9 @@ private function recordFailedAttempt(array $shareData, string $register, string $shareData['failedAttempts'] = (int) ($shareData['failedAttempts'] ?? 0) + 1; if ($shareData['failedAttempts'] >= self::MAX_FAILED_ATTEMPTS) { - $lockUntil = new \DateTime(); + $lockUntil = new \DateTime(); $lockUntil->modify('+'.self::LOCKOUT_MINUTES.' minutes'); - $shareData['lockedUntil'] = $lockUntil->format('c'); + $shareData['lockedUntil'] = $lockUntil->format('c'); $shareData['failedAttempts'] = 0; $this->logger->warning( diff --git a/lib/Service/CaseTransferService.php b/lib/Service/CaseTransferService.php index 96b62aae..f8b1bcf5 100644 --- a/lib/Service/CaseTransferService.php +++ b/lib/Service/CaseTransferService.php @@ -38,8 +38,8 @@ class CaseTransferService * * @param SettingsService $settingsService The settings service * @param IAppManager $appManager The app manager - * @param ContainerInterface $container The DI container - * @param LoggerInterface $logger The logger + * @param ContainerInterface $container The DI container + * @param LoggerInterface $logger The logger * * @return void */ @@ -155,7 +155,7 @@ public function acceptTransfer(string $transferId): array /** * Reject a pending case transfer request. * - * @param string $transferId The UUID of the transfer request + * @param string $transferId The UUID of the transfer request * @param string $rejectionReason The reason for rejection * * @return array The updated transfer data diff --git a/lib/Service/ChecklistService.php b/lib/Service/ChecklistService.php index 9fd94056..424f0661 100644 --- a/lib/Service/ChecklistService.php +++ b/lib/Service/ChecklistService.php @@ -68,7 +68,7 @@ class ChecklistService public function __construct( private readonly LoggerInterface $logger, ) { - } + }//end __construct() /** * Complete a checklist item with a conformity status. @@ -89,16 +89,16 @@ public function completeItem( array $checklist, string $itemId, string $status, - string $toelichting = '', - array $photoRefs = [], + string $toelichting='', + array $photoRefs=[], ): array { if (!in_array($status, self::VALID_STATUSES, true)) { throw new \InvalidArgumentException( - 'Invalid conformity status: ' . $status . '. Valid: ' . implode(', ', self::VALID_STATUSES) + 'Invalid conformity status: '.$status.'. Valid: '.implode(', ', self::VALID_STATUSES) ); } - $items = $checklist['items'] ?? []; + $items = $checklist['items'] ?? []; $itemFound = false; foreach ($items as $index => $item) { @@ -107,13 +107,13 @@ public function completeItem( $requiresPhoto = $item['fotoVerplichtBijNietConform'] ?? false; if ($status === self::STATUS_NIET_CONFORM && $requiresPhoto && empty($photoRefs)) { throw new \InvalidArgumentException( - 'Foto verplicht bij niet-conform voor item: ' . ($item['description'] ?? $itemId) + 'Foto verplicht bij niet-conform voor item: '.($item['description'] ?? $itemId) ); } - $items[$index]['status'] = $status; + $items[$index]['status'] = $status; $items[$index]['toelichting'] = $toelichting; - $items[$index]['photoRefs'] = $photoRefs; + $items[$index]['photoRefs'] = $photoRefs; $items[$index]['completedAt'] = (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM); $itemFound = true; break; @@ -121,7 +121,7 @@ public function completeItem( } if (!$itemFound) { - throw new \InvalidArgumentException('Checklist item not found: ' . $itemId); + throw new \InvalidArgumentException('Checklist item not found: '.$itemId); } $checklist['items'] = $items; @@ -132,7 +132,7 @@ public function completeItem( ); return $checklist; - } + }//end completeItem() /** * Get the completion progress of a checklist. @@ -145,8 +145,8 @@ public function completeItem( */ public function getProgress(array $checklist): array { - $items = $checklist['items'] ?? []; - $total = count($items); + $items = $checklist['items'] ?? []; + $total = count($items); $completed = 0; foreach ($items as $item) { @@ -156,11 +156,11 @@ public function getProgress(array $checklist): array } return [ - 'completed' => $completed, - 'total' => $total, + 'completed' => $completed, + 'total' => $total, 'percentage' => $total > 0 ? round(($completed / $total) * 100, 1) : 0.0, ]; - } + }//end getProgress() /** * Validate that all checklist items are completed. @@ -173,7 +173,7 @@ public function getProgress(array $checklist): array */ public function validateCompletion(array $checklist): array { - $items = $checklist['items'] ?? []; + $items = $checklist['items'] ?? []; $missingItems = []; foreach ($items as $item) { @@ -183,10 +183,10 @@ public function validateCompletion(array $checklist): array } return [ - 'valid' => empty($missingItems), + 'valid' => empty($missingItems), 'missingItems' => $missingItems, ]; - } + }//end validateCompletion() /** * Get a summary of conformity results. @@ -199,11 +199,11 @@ public function validateCompletion(array $checklist): array */ public function getConformitySummary(array $checklist): array { - $items = $checklist['items'] ?? []; + $items = $checklist['items'] ?? []; $summary = [ - 'conform' => 0, - 'nietConform' => 0, - 'nvt' => 0, + 'conform' => 0, + 'nietConform' => 0, + 'nvt' => 0, 'notCompleted' => 0, ]; @@ -218,5 +218,5 @@ public function getConformitySummary(array $checklist): array } return $summary; - } -} + }//end getConformitySummary() +}//end class diff --git a/lib/Service/ConsultationService.php b/lib/Service/ConsultationService.php index 8705f283..f1d362fa 100644 --- a/lib/Service/ConsultationService.php +++ b/lib/Service/ConsultationService.php @@ -52,7 +52,6 @@ class ConsultationService 'niet_van_toepassing', ]; - /** * Constructor. * @@ -63,8 +62,7 @@ public function __construct( private readonly SettingsService $settingsService, private readonly LoggerInterface $logger, ) { - } - + }//end __construct() /** * Create a consultation linked to a parent case. @@ -105,8 +103,8 @@ public function createConsultation(array $data): array $consultation = $objectService->saveObject($register, $schema, $data); $this->logger->info( - 'Consultation created: ' . $consultation->getUuid() - . ' for case ' . $data['parentZaak'], + 'Consultation created: '.$consultation->getUuid() + .' for case '.$data['parentZaak'], ['app' => Application::APP_ID], ); @@ -114,8 +112,7 @@ public function createConsultation(array $data): array 'id' => $consultation->getUuid(), 'status' => 'open', ]; - } - + }//end createConsultation() /** * Get all consultations for a case. @@ -147,8 +144,7 @@ public function getConsultationsForCase(string $caseId): array ); return is_array($results) ? $results : []; - } - + }//end getConsultationsForCase() /** * Update consultation status. @@ -163,7 +159,7 @@ public function getConsultationsForCase(string $caseId): array public function updateStatus(string $consultationId, string $newStatus): array { if (in_array($newStatus, self::VALID_STATUSES, true) === false) { - throw new \RuntimeException('Invalid status: ' . $newStatus); + throw new \RuntimeException('Invalid status: '.$newStatus); } $objectService = $this->settingsService->getObjectService(); @@ -182,7 +178,7 @@ public function updateStatus(string $consultationId, string $newStatus): array $result = $objectService->saveObject($register, $schema, $updateData, $consultationId); $this->logger->info( - 'Consultation ' . $consultationId . ' status updated to ' . $newStatus, + 'Consultation '.$consultationId.' status updated to '.$newStatus, ['app' => Application::APP_ID], ); @@ -190,8 +186,7 @@ public function updateStatus(string $consultationId, string $newStatus): array 'id' => $consultationId, 'status' => $newStatus, ]; - } - + }//end updateStatus() /** * Submit advice response to a consultation. @@ -207,7 +202,7 @@ public function submitResponse(string $consultationId, array $response): array { $advies = $response['advies'] ?? ''; if (in_array($advies, self::VALID_RESPONSES, true) === false) { - throw new \RuntimeException('Invalid advice type: ' . $advies); + throw new \RuntimeException('Invalid advice type: '.$advies); } $objectService = $this->settingsService->getObjectService(); @@ -219,19 +214,17 @@ public function submitResponse(string $consultationId, array $response): array $schema = $this->settingsService->getConfigValue('consultation_schema'); $updateData = [ - 'advies' => $advies, - 'toelichting' => $response['toelichting'] ?? '', - 'voorwaarden' => isset($response['voorwaarden']) - ? json_encode($response['voorwaarden']) - : null, - 'adviesDatum' => date('Y-m-d'), - 'status' => 'advies_uitgebracht', + 'advies' => $advies, + 'toelichting' => $response['toelichting'] ?? '', + 'voorwaarden' => isset($response['voorwaarden']) ? json_encode($response['voorwaarden']) : null, + 'adviesDatum' => date('Y-m-d'), + 'status' => 'advies_uitgebracht', ]; $result = $objectService->saveObject($register, $schema, $updateData, $consultationId); $this->logger->info( - 'Consultation ' . $consultationId . ' advice submitted: ' . $advies, + 'Consultation '.$consultationId.' advice submitted: '.$advies, ['app' => Application::APP_ID], ); @@ -240,8 +233,7 @@ public function submitResponse(string $consultationId, array $response): array 'advies' => $advies, 'status' => 'advies_uitgebracht', ]; - } - + }//end submitResponse() /** * Get overdue consultations. @@ -294,5 +286,5 @@ public function getOverdueConsultations(): array } return $overdue; - } -} + }//end getOverdueConsultations() +}//end class diff --git a/lib/Service/DsoIntakeService.php b/lib/Service/DsoIntakeService.php index 0d75539b..11d1b11e 100644 --- a/lib/Service/DsoIntakeService.php +++ b/lib/Service/DsoIntakeService.php @@ -39,11 +39,10 @@ class DsoIntakeService * Deadline durations per procedure type (ISO 8601). */ private const DEADLINE_DURATIONS = [ - 'regulier' => 'P56D', - 'uitgebreid' => 'P182D', + 'regulier' => 'P56D', + 'uitgebreid' => 'P182D', ]; - /** * Constructor. * @@ -54,8 +53,7 @@ public function __construct( private readonly SettingsService $settingsService, private readonly LoggerInterface $logger, ) { - } - + }//end __construct() /** * Process a DSO vergunningaanvraag and create a case. @@ -94,18 +92,17 @@ static function ($act) { }, $activiteiten, ); - $activityStr = implode(', ', array_filter($activityNames)); + $activityStr = implode(', ', array_filter($activityNames)); // Determine processing deadline. - $deadline = self::DEADLINE_DURATIONS[$procedureType] - ?? self::DEADLINE_DURATIONS['regulier']; + $deadline = self::DEADLINE_DURATIONS[$procedureType] ?? self::DEADLINE_DURATIONS['regulier']; // Create the case. $caseSchema = $this->settingsService->getConfigValue('case_schema'); $caseData = [ - 'title' => 'Omgevingsvergunning' . ($activityStr !== '' ? ': ' . $activityStr : ''), + 'title' => 'Omgevingsvergunning'.($activityStr !== '' ? ': '.$activityStr : ''), 'description' => 'Vergunningaanvraag ontvangen via DSO/Omgevingsloket' - . ($dsoZaaknummer !== '' ? ' (DSO: ' . $dsoZaaknummer . ')' : ''), + .($dsoZaaknummer !== '' ? ' (DSO: '.$dsoZaaknummer.')' : ''), 'startDate' => date('Y-m-d'), 'priority' => 'normal', ]; @@ -129,15 +126,19 @@ static function ($act) { continue; } - $objectService->saveObject($register, $propertySchema, [ - 'case' => $caseId, - 'name' => $name, - 'value' => $value, - ]); + $objectService->saveObject( + $register, + $propertySchema, + [ + 'case' => $caseId, + 'name' => $name, + 'value' => $value, + ] + ); } $this->logger->info( - 'DSO intake processed: case ' . $caseId . ' (DSO: ' . $dsoZaaknummer . ')', + 'DSO intake processed: case '.$caseId.' (DSO: '.$dsoZaaknummer.')', ['app' => Application::APP_ID], ); @@ -148,8 +149,7 @@ static function ($act) { 'procedureType' => $procedureType, 'deadline' => $deadline, ]; - } - + }//end processAanvraag() /** * Get the processing deadline duration for a procedure type. @@ -160,7 +160,6 @@ static function ($act) { */ public function getDeadlineDuration(string $procedureType): string { - return self::DEADLINE_DURATIONS[$procedureType] - ?? self::DEADLINE_DURATIONS['regulier']; - } -} + return self::DEADLINE_DURATIONS[$procedureType] ?? self::DEADLINE_DURATIONS['regulier']; + }//end getDeadlineDuration() +}//end class diff --git a/lib/Service/InspectionService.php b/lib/Service/InspectionService.php index e2fa0ca5..c6978469 100644 --- a/lib/Service/InspectionService.php +++ b/lib/Service/InspectionService.php @@ -69,13 +69,13 @@ public function __construct( private readonly SettingsService $settingsService, private readonly LoggerInterface $logger, ) { - } + }//end __construct() /** * Get inspections assigned to an inspector, optionally filtered by date. * - * @param string $inspectorId The inspector's user ID. - * @param string|null $date Optional date filter (Y-m-d format). + * @param string $inspectorId The inspector's user ID. + * @param string|null $date Optional date filter (Y-m-d format). * @param array> $allInspections All inspection data (from OpenRegister). * * @return array> Filtered and sorted inspections. @@ -87,26 +87,34 @@ public function getInspections( ?string $date, array $allInspections, ): array { - $filtered = array_filter($allInspections, function (array $inspection) use ($inspectorId, $date): bool { - if (($inspection['inspectorId'] ?? '') !== $inspectorId) { - return false; - } - if ($date !== null) { - $inspectionDate = substr($inspection['plannedDateTime'] ?? '', 0, 10); - if ($inspectionDate !== $date) { - return false; + $filtered = array_filter( + $allInspections, + function (array $inspection) use ($inspectorId, $date): bool { + if (($inspection['inspectorId'] ?? '') !== $inspectorId) { + return false; + } + + if ($date !== null) { + $inspectionDate = substr($inspection['plannedDateTime'] ?? '', 0, 10); + if ($inspectionDate !== $date) { + return false; + } + } + + return true; } - } - return true; - }); + ); // Sort by planned time. - usort($filtered, function (array $a, array $b): int { - return ($a['plannedDateTime'] ?? '') <=> ($b['plannedDateTime'] ?? ''); - }); + usort( + $filtered, + function (array $a, array $b): int { + return ($a['plannedDateTime'] ?? '') <=> ($b['plannedDateTime'] ?? ''); + } + ); return array_values($filtered); - } + }//end getInspections() /** * Capture GPS location for an inspection and validate against planned location. @@ -131,18 +139,18 @@ public function captureLocation( float $accuracy, ): array { $inspection['capturedLocation'] = [ - 'latitude' => $latitude, - 'longitude' => $longitude, - 'accuracy' => $accuracy, + 'latitude' => $latitude, + 'longitude' => $longitude, + 'accuracy' => $accuracy, 'capturedAt' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), ]; - $warning = null; + $warning = null; $distance = 0.0; // Check distance from planned location. - $plannedLat = (float)($inspection['plannedLatitude'] ?? 0.0); - $plannedLon = (float)($inspection['plannedLongitude'] ?? 0.0); + $plannedLat = (float) ($inspection['plannedLatitude'] ?? 0.0); + $plannedLon = (float) ($inspection['plannedLongitude'] ?? 0.0); if ($plannedLat !== 0.0 && $plannedLon !== 0.0) { $distance = $this->calculateDistance($latitude, $longitude, $plannedLat, $plannedLon); @@ -155,7 +163,7 @@ public function captureLocation( $this->logger->warning( 'Location mismatch for inspection {id}: {distance}m from planned', [ - 'id' => $inspection['id'] ?? 'unknown', + 'id' => $inspection['id'] ?? 'unknown', 'distance' => round($distance), ] ); @@ -168,16 +176,16 @@ public function captureLocation( return [ 'inspection' => $inspection, - 'warning' => $warning, - 'distance' => round($distance, 1), + 'warning' => $warning, + 'distance' => round($distance, 1), ]; - } + }//end captureLocation() /** * Record photo metadata for an inspection. * - * @param array $inspection The inspection data. - * @param array $photoMetadata Photo info (fileRef, latitude, longitude, checklistItemId). + * @param array $inspection The inspection data. + * @param array $photoMetadata Photo info (fileRef, latitude, longitude, checklistItemId). * * @return array The updated inspection with photo added. * @@ -186,19 +194,19 @@ public function captureLocation( public function addPhoto(array $inspection, array $photoMetadata): array { $photo = [ - 'id' => $photoMetadata['id'] ?? uniqid('photo_', true), - 'fileRef' => $photoMetadata['fileRef'] ?? '', - 'latitude' => $photoMetadata['latitude'] ?? null, - 'longitude' => $photoMetadata['longitude'] ?? null, + 'id' => $photoMetadata['id'] ?? uniqid('photo_', true), + 'fileRef' => $photoMetadata['fileRef'] ?? '', + 'latitude' => $photoMetadata['latitude'] ?? null, + 'longitude' => $photoMetadata['longitude'] ?? null, 'checklistItemId' => $photoMetadata['checklistItemId'] ?? null, - 'capturedAt' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), + 'capturedAt' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), ]; - $inspection['photos'] = $inspection['photos'] ?? []; + $inspection['photos'] = $inspection['photos'] ?? []; $inspection['photos'][] = $photo; return $inspection; - } + }//end addPhoto() /** * Complete an inspection. @@ -212,22 +220,22 @@ public function addPhoto(array $inspection, array $photoMetadata): array * * @psalm-suppress PossiblyUnusedMethod */ - public function completeInspection(array $inspection, string $conclusion = ''): array + public function completeInspection(array $inspection, string $conclusion=''): array { $checklist = $inspection['checklist'] ?? []; - $items = $checklist['items'] ?? []; + $items = $checklist['items'] ?? []; // Check if all items are completed. foreach ($items as $item) { if (empty($item['status'])) { throw new \InvalidArgumentException( - 'Not all checklist items are completed. Item: ' . ($item['description'] ?? 'unknown') + 'Not all checklist items are completed. Item: '.($item['description'] ?? 'unknown') ); } } - $inspection['status'] = self::STATUS_COMPLETED; - $inspection['conclusion'] = $conclusion; + $inspection['status'] = self::STATUS_COMPLETED; + $inspection['conclusion'] = $conclusion; $inspection['completedAt'] = (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM); $this->logger->info( @@ -236,7 +244,7 @@ public function completeInspection(array $inspection, string $conclusion = ''): ); return $inspection; - } + }//end completeInspection() /** * Calculate distance between two GPS coordinates using Haversine formula. @@ -253,12 +261,10 @@ private function calculateDistance(float $lat1, float $lon1, float $lat2, float $dLat = deg2rad($lat2 - $lat1); $dLon = deg2rad($lon2 - $lon1); - $a = sin($dLat / 2) * sin($dLat / 2) - + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) - * sin($dLon / 2) * sin($dLon / 2); + $a = sin($dLat / 2) * sin($dLat / 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLon / 2) * sin($dLon / 2); $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); return self::EARTH_RADIUS * $c; - } -} + }//end calculateDistance() +}//end class diff --git a/lib/Service/LegesCalculationService.php b/lib/Service/LegesCalculationService.php index 75b48baa..12f1e1b8 100644 --- a/lib/Service/LegesCalculationService.php +++ b/lib/Service/LegesCalculationService.php @@ -73,14 +73,14 @@ class LegesCalculationService public function __construct( private readonly LoggerInterface $logger, ) { - } + }//end __construct() /** * Calculate leges for a case based on applicable verordening. * - * @param array $caseData The case data (bouwkosten, activiteiten, etc.). - * @param array $verordening The applicable verordening with artikelen. - * @param string $calculatedBy User ID of the person triggering the calculation. + * @param array $caseData The case data (bouwkosten, activiteiten, etc.). + * @param array $verordening The applicable verordening with artikelen. + * @param string $calculatedBy User ID of the person triggering the calculation. * * @return array{ * total: float, @@ -105,33 +105,33 @@ public function calculate( $artikelen = $verordening['artikelen'] ?? []; $breakdown = []; - $total = 0.0; + $total = 0.0; foreach ($artikelen as $artikel) { $result = $this->calculateArtikel($artikel, $caseData); if ($result !== null) { $breakdown[] = $result; - $total += $result['amount']; + $total += $result['amount']; } } // Apply global maximum if configured. $globalMax = $verordening['globalMaximum'] ?? null; - if ($globalMax !== null && $total > (float)$globalMax) { - $total = (float)$globalMax; + if ($globalMax !== null && $total > (float) $globalMax) { + $total = (float) $globalMax; } $total = round($total, self::PRECISION); return [ - 'total' => $total, - 'breakdown' => $breakdown, - 'verordening' => $verordening['name'] ?? '', + 'total' => $total, + 'breakdown' => $breakdown, + 'verordening' => $verordening['name'] ?? '', 'calculatedBy' => $calculatedBy, 'calculatedAt' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), - 'version' => 1, + 'version' => 1, ]; - } + }//end calculate() /** * Recalculate leges with corrected case data, preserving history. @@ -153,18 +153,18 @@ public function recalculate( string $calculatedBy, string $correctionReason, ): array { - $newCalc = $this->calculate($caseData, $verordening, $calculatedBy); + $newCalc = $this->calculate($caseData, $verordening, $calculatedBy); $newCalc['version'] = ($previousCalc['version'] ?? 0) + 1; - $newCalc['previousVersion'] = $previousCalc['version'] ?? 0; + $newCalc['previousVersion'] = $previousCalc['version'] ?? 0; $newCalc['correctionReason'] = $correctionReason; - $newCalc['previousTotal'] = $previousCalc['total'] ?? 0.0; - $newCalc['difference'] = round( + $newCalc['previousTotal'] = $previousCalc['total'] ?? 0.0; + $newCalc['difference'] = round( $newCalc['total'] - ($previousCalc['total'] ?? 0.0), self::PRECISION ); return $newCalc; - } + }//end recalculate() /** * Calculate verrekening (deduction of previously imposed fees). @@ -181,12 +181,12 @@ public function calculateVerrekening(float $currentAmount, float $previousAmount $netAmount = round($currentAmount - $previousAmount, self::PRECISION); return [ - 'netAmount' => $netAmount, - 'deduction' => $previousAmount, - 'currentAmount' => $currentAmount, + 'netAmount' => $netAmount, + 'deduction' => $previousAmount, + 'currentAmount' => $currentAmount, 'previousAmount' => $previousAmount, ]; - } + }//end calculateVerrekening() /** * Calculate teruggaaf (refund). @@ -201,18 +201,18 @@ public function calculateVerrekening(float $currentAmount, float $previousAmount */ public function calculateTeruggaaf( float $imposedAmount, - float $refundFraction = 1.0, - string $reason = '', + float $refundFraction=1.0, + string $reason='', ): array { $refundAmount = round(-1 * $imposedAmount * $refundFraction, self::PRECISION); return [ - 'refundAmount' => $refundAmount, + 'refundAmount' => $refundAmount, 'originalAmount' => $imposedAmount, - 'fraction' => $refundFraction, - 'reason' => $reason, + 'fraction' => $refundFraction, + 'reason' => $reason, ]; - } + }//end calculateTeruggaaf() /** * Calculate a single artikel. @@ -224,13 +224,13 @@ public function calculateTeruggaaf( */ private function calculateArtikel(array $artikel, array $caseData): ?array { - $type = $artikel['type'] ?? ''; - $artikelNr = $artikel['nummer'] ?? ''; + $type = $artikel['type'] ?? ''; + $artikelNr = $artikel['nummer'] ?? ''; $description = $artikel['omschrijving'] ?? ''; // Determine the grondslag (base amount) from case data. $grondslagField = $artikel['grondslagField'] ?? 'bouwkosten'; - $grondslag = (float)($caseData[$grondslagField] ?? 0.0); + $grondslag = (float) ($caseData[$grondslagField] ?? 0.0); $amount = match ($type) { self::TYPE_VAST => $this->calculateVast($artikel), @@ -246,13 +246,13 @@ private function calculateArtikel(array $artikel, array $caseData): ?array } return [ - 'artikel' => $artikelNr, + 'artikel' => $artikelNr, 'description' => $description, - 'grondslag' => $grondslag, - 'amount' => round($amount, self::PRECISION), - 'type' => $type, + 'grondslag' => $grondslag, + 'amount' => round($amount, self::PRECISION), + 'type' => $type, ]; - } + }//end calculateArtikel() /** * Calculate a fixed amount (vast bedrag). @@ -263,8 +263,8 @@ private function calculateArtikel(array $artikel, array $caseData): ?array */ private function calculateVast(array $artikel): float { - return (float)($artikel['bedrag'] ?? 0.0); - } + return (float) ($artikel['bedrag'] ?? 0.0); + }//end calculateVast() /** * Calculate a percentage of the grondslag. @@ -276,9 +276,9 @@ private function calculateVast(array $artikel): float */ private function calculatePercentage(float $grondslag, array $artikel): float { - $percentage = (float)($artikel['percentage'] ?? 0.0); + $percentage = (float) ($artikel['percentage'] ?? 0.0); return $grondslag * ($percentage / 100.0); - } + }//end calculatePercentage() /** * Calculate using tiered brackets (staffel). @@ -294,12 +294,12 @@ private function calculatePercentage(float $grondslag, array $artikel): float private function calculateStaffel(float $grondslag, array $artikel): float { $brackets = $artikel['brackets'] ?? []; - $total = 0.0; + $total = 0.0; foreach ($brackets as $bracket) { - $from = (float)($bracket['from'] ?? 0.0); - $to = (float)($bracket['to'] ?? PHP_FLOAT_MAX); - $percentage = (float)($bracket['percentage'] ?? 0.0); + $from = (float) ($bracket['from'] ?? 0.0); + $to = (float) ($bracket['to'] ?? PHP_FLOAT_MAX); + $percentage = (float) ($bracket['percentage'] ?? 0.0); if ($grondslag <= $from) { break; @@ -312,7 +312,7 @@ private function calculateStaffel(float $grondslag, array $artikel): float } return $total; - } + }//end calculateStaffel() /** * Calculate with a maximum cap. @@ -324,7 +324,7 @@ private function calculateStaffel(float $grondslag, array $artikel): float */ private function calculateMaximum(float $grondslag, array $artikel): float { - $maximum = (float)($artikel['maximum'] ?? PHP_FLOAT_MAX); + $maximum = (float) ($artikel['maximum'] ?? PHP_FLOAT_MAX); $subType = $artikel['subType'] ?? self::TYPE_PERCENTAGE; $calculated = match ($subType) { @@ -334,7 +334,7 @@ private function calculateMaximum(float $grondslag, array $artikel): float }; return min($calculated, $maximum); - } + }//end calculateMaximum() /** * Calculate a combination of multiple sub-calculations. @@ -351,7 +351,7 @@ private function calculateCombinatie( array $caseData, ): float { $subArtikelen = $artikel['subArtikelen'] ?? []; - $total = 0.0; + $total = 0.0; foreach ($subArtikelen as $subArtikel) { $result = $this->calculateArtikel($subArtikel, $caseData); @@ -361,5 +361,5 @@ private function calculateCombinatie( } return $total; - } -} + }//end calculateCombinatie() +}//end class diff --git a/lib/Service/LegesExportService.php b/lib/Service/LegesExportService.php index b60ae508..6c6a3785 100644 --- a/lib/Service/LegesExportService.php +++ b/lib/Service/LegesExportService.php @@ -85,7 +85,7 @@ class LegesExportService public function __construct( private readonly LoggerInterface $logger, ) { - } + }//end __construct() /** * Export berekeningen to the specified format. @@ -99,11 +99,11 @@ public function __construct( * * @psalm-suppress PossiblyUnusedMethod */ - public function export(array $berekeningen, string $format = self::FORMAT_CSV): array + public function export(array $berekeningen, string $format=self::FORMAT_CSV): array { if (!in_array($format, self::SUPPORTED_FORMATS, true)) { throw new \InvalidArgumentException( - 'Unsupported export format: ' . $format . '. Supported: ' . implode(', ', self::SUPPORTED_FORMATS) + 'Unsupported export format: '.$format.'. Supported: '.implode(', ', self::SUPPORTED_FORMATS) ); } @@ -117,7 +117,7 @@ public function export(array $berekeningen, string $format = self::FORMAT_CSV): self::FORMAT_ASCII => $this->exportASCII($berekeningen), self::FORMAT_XML => $this->exportXML($berekeningen), }; - } + }//end export() /** * Export berekeningen as CSV. @@ -153,11 +153,11 @@ private function exportCSV(array $berekeningen): array $date = (new \DateTimeImmutable())->format('Y-m-d'); return [ - 'content' => $content !== false ? $content : '', - 'filename' => "leges-export-{$date}.csv", + 'content' => $content !== false ? $content : '', + 'filename' => "leges-export-{$date}.csv", 'contentType' => 'text/csv; charset=utf-8', ]; - } + }//end exportCSV() /** * Export berekeningen as ASCII flat file. @@ -180,22 +180,22 @@ private function exportASCII(array $berekeningen): array foreach ($berekeningen as $berekening) { $rows = $this->flattenBerekening($berekening); foreach ($rows as $row) { - $lines[] = 'D|' . implode('|', $row); + $lines[] = 'D|'.implode('|', $row); } } // Footer line. - $total = array_sum(array_column($berekeningen, 'total')); + $total = array_sum(array_column($berekeningen, 'total')); $lines[] = sprintf('F|%d|%.2f', count($berekeningen), $total); $date = (new \DateTimeImmutable())->format('Y-m-d'); return [ - 'content' => implode("\r\n", $lines), - 'filename' => "leges-export-{$date}.txt", + 'content' => implode("\r\n", $lines), + 'filename' => "leges-export-{$date}.txt", 'contentType' => 'text/plain; charset=utf-8', ]; - } + }//end exportASCII() /** * Export berekeningen as XML (StUF-FIN compatible structure). @@ -211,23 +211,23 @@ private function exportXML(array $berekeningen): array $root = $dom->createElement('legesExport'); $root->setAttribute('exportDatum', (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM)); - $root->setAttribute('aantalRecords', (string)count($berekeningen)); + $root->setAttribute('aantalRecords', (string) count($berekeningen)); $dom->appendChild($root); foreach ($berekeningen as $berekening) { $berekeningEl = $dom->createElement('berekening'); - $berekeningEl->setAttribute('zaaknummer', (string)($berekening['zaaknummer'] ?? '')); + $berekeningEl->setAttribute('zaaknummer', (string) ($berekening['zaaknummer'] ?? '')); - $this->addXmlElement($dom, $berekeningEl, 'bsnKvk', (string)($berekening['bsnKvk'] ?? '')); - $this->addXmlElement($dom, $berekeningEl, 'naam', (string)($berekening['naam'] ?? '')); + $this->addXmlElement($dom, $berekeningEl, 'bsnKvk', (string) ($berekening['bsnKvk'] ?? '')); + $this->addXmlElement($dom, $berekeningEl, 'naam', (string) ($berekening['naam'] ?? '')); $this->addXmlElement($dom, $berekeningEl, 'totaalBedrag', number_format($berekening['total'] ?? 0.0, 2, '.', '')); - $this->addXmlElement($dom, $berekeningEl, 'datumBeschikking', (string)($berekening['datumBeschikking'] ?? '')); + $this->addXmlElement($dom, $berekeningEl, 'datumBeschikking', (string) ($berekening['datumBeschikking'] ?? '')); $breakdown = $berekening['breakdown'] ?? []; foreach ($breakdown as $regel) { $regelEl = $dom->createElement('regel'); - $this->addXmlElement($dom, $regelEl, 'artikelnummer', (string)($regel['artikel'] ?? '')); - $this->addXmlElement($dom, $regelEl, 'omschrijving', (string)($regel['description'] ?? '')); + $this->addXmlElement($dom, $regelEl, 'artikelnummer', (string) ($regel['artikel'] ?? '')); + $this->addXmlElement($dom, $regelEl, 'omschrijving', (string) ($regel['description'] ?? '')); $this->addXmlElement($dom, $regelEl, 'bedrag', number_format($regel['amount'] ?? 0.0, 2, '.', '')); $berekeningEl->appendChild($regelEl); } @@ -236,14 +236,14 @@ private function exportXML(array $berekeningen): array } $content = $dom->saveXML(); - $date = (new \DateTimeImmutable())->format('Y-m-d'); + $date = (new \DateTimeImmutable())->format('Y-m-d'); return [ - 'content' => $content !== false ? $content : '', - 'filename' => "leges-export-{$date}.xml", + 'content' => $content !== false ? $content : '', + 'filename' => "leges-export-{$date}.xml", 'contentType' => 'application/xml; charset=utf-8', ]; - } + }//end exportXML() /** * Flatten a berekening into export rows (one row per artikel in breakdown). @@ -254,45 +254,45 @@ private function exportXML(array $berekeningen): array */ private function flattenBerekening(array $berekening): array { - $rows = []; + $rows = []; $breakdown = $berekening['breakdown'] ?? []; if (empty($breakdown)) { $rows[] = [ - (string)($berekening['zaaknummer'] ?? ''), - (string)($berekening['bsnKvk'] ?? ''), - (string)($berekening['naam'] ?? ''), - (string)($berekening['adres'] ?? ''), + (string) ($berekening['zaaknummer'] ?? ''), + (string) ($berekening['bsnKvk'] ?? ''), + (string) ($berekening['naam'] ?? ''), + (string) ($berekening['adres'] ?? ''), '', 'Totaal', number_format($berekening['total'] ?? 0.0, 2, '.', ''), - (string)($berekening['datumBeschikking'] ?? ''), + (string) ($berekening['datumBeschikking'] ?? ''), ]; } else { foreach ($breakdown as $regel) { $rows[] = [ - (string)($berekening['zaaknummer'] ?? ''), - (string)($berekening['bsnKvk'] ?? ''), - (string)($berekening['naam'] ?? ''), - (string)($berekening['adres'] ?? ''), - (string)($regel['artikel'] ?? ''), - (string)($regel['description'] ?? ''), + (string) ($berekening['zaaknummer'] ?? ''), + (string) ($berekening['bsnKvk'] ?? ''), + (string) ($berekening['naam'] ?? ''), + (string) ($berekening['adres'] ?? ''), + (string) ($regel['artikel'] ?? ''), + (string) ($regel['description'] ?? ''), number_format($regel['amount'] ?? 0.0, 2, '.', ''), - (string)($berekening['datumBeschikking'] ?? ''), + (string) ($berekening['datumBeschikking'] ?? ''), ]; } - } + }//end if return $rows; - } + }//end flattenBerekening() /** * Add a text element to an XML parent. * - * @param \DOMDocument $dom The DOM document. - * @param \DOMElement $parent The parent element. - * @param string $name The element name. - * @param string $value The text value. + * @param \DOMDocument $dom The DOM document. + * @param \DOMElement $parent The parent element. + * @param string $name The element name. + * @param string $value The text value. * * @return void */ @@ -301,5 +301,5 @@ private function addXmlElement(\DOMDocument $dom, \DOMElement $parent, string $n $element = $dom->createElement($name); $element->appendChild($dom->createTextNode($value)); $parent->appendChild($element); - } -} + }//end addXmlElement() +}//end class diff --git a/lib/Service/MilestoneService.php b/lib/Service/MilestoneService.php index ad640fbb..b334502d 100644 --- a/lib/Service/MilestoneService.php +++ b/lib/Service/MilestoneService.php @@ -30,8 +30,6 @@ */ class MilestoneService { - - /** * Constructor. * @@ -42,8 +40,7 @@ public function __construct( private readonly SettingsService $settingsService, private readonly LoggerInterface $logger, ) { - } - + }//end __construct() /** * Get milestone definitions for a case type. @@ -77,8 +74,7 @@ public function getMilestones(string $caseTypeId): array ); return is_array($results) ? $results : []; - } - + }//end getMilestones() /** * Get milestone progress for a specific case. @@ -93,14 +89,14 @@ public function getCaseProgress(string $caseId, string $caseTypeId): array $definitions = $this->getMilestones($caseTypeId); if (count($definitions) === 0) { return [ - 'milestones' => [], - 'reached' => 0, - 'total' => 0, - 'percentage' => 0, + 'milestones' => [], + 'reached' => 0, + 'total' => 0, + 'percentage' => 0, ]; } - $records = $this->getMilestoneRecords($caseId); + $records = $this->getMilestoneRecords($caseId); $recordMap = []; foreach ($records as $record) { $recordMap[$record['milestoneDefinition'] ?? ''] = $record; @@ -109,8 +105,8 @@ public function getCaseProgress(string $caseId, string $caseTypeId): array $milestones = []; $reached = 0; foreach ($definitions as $def) { - $defId = $def['id'] ?? $def['uuid'] ?? ''; - $record = $recordMap[$defId] ?? null; + $defId = $def['id'] ?? $def['uuid'] ?? ''; + $record = $recordMap[$defId] ?? null; $isReached = $record !== null; if ($isReached === true) { @@ -136,8 +132,7 @@ public function getCaseProgress(string $caseId, string $caseTypeId): array 'total' => $total, 'percentage' => $total > 0 ? (int) round(($reached / $total) * 100) : 0, ]; - } - + }//end getCaseProgress() /** * Mark a milestone as reached for a case. @@ -155,7 +150,7 @@ public function markMilestone( string $caseId, string $milestoneDefinitionId, string $userId, - string $trigger = 'manual', + string $trigger='manual', ): array { $objectService = $this->settingsService->getObjectService(); if ($objectService === null) { @@ -180,7 +175,7 @@ public function markMilestone( $record = $objectService->saveObject($register, $schema, $recordData); $this->logger->info( - 'Milestone marked: ' . $milestoneDefinitionId . ' on case ' . $caseId, + 'Milestone marked: '.$milestoneDefinitionId.' on case '.$caseId, ['app' => Application::APP_ID], ); @@ -189,8 +184,7 @@ public function markMilestone( 'reachedAt' => $recordData['reachedAt'], 'reachedBy' => $userId, ]; - } - + }//end markMilestone() /** * Reverse a milestone (with reason for audit trail). @@ -240,14 +234,13 @@ public function reverseMilestone( } $this->logger->info( - 'Milestone reversed: ' . $milestoneDefinitionId . ' on case ' . $caseId - . ' by ' . $userId . ' reason: ' . $reason, + 'Milestone reversed: '.$milestoneDefinitionId.' on case '.$caseId + .' by '.$userId.' reason: '.$reason, ['app' => Application::APP_ID], ); return true; - } - + }//end reverseMilestone() /** * Calculate average duration between milestones for a case type. @@ -261,7 +254,7 @@ public function getDurationAnalytics(string $caseTypeId): array // Placeholder: in production, this would aggregate milestone records // across all cases of this type and calculate averages. $this->logger->debug( - 'Duration analytics requested for case type: ' . $caseTypeId, + 'Duration analytics requested for case type: '.$caseTypeId, ['app' => Application::APP_ID], ); @@ -270,8 +263,7 @@ public function getDurationAnalytics(string $caseTypeId): array 'phases' => [], 'message' => 'Duration analytics requires sufficient historical data', ]; - } - + }//end getDurationAnalytics() /** * Get milestone records for a case. @@ -303,5 +295,5 @@ private function getMilestoneRecords(string $caseId): array ); return is_array($results) ? $results : []; - } -} + }//end getMilestoneRecords() +}//end class diff --git a/lib/Service/ParaferingService.php b/lib/Service/ParaferingService.php index b4642400..abd225f8 100644 --- a/lib/Service/ParaferingService.php +++ b/lib/Service/ParaferingService.php @@ -105,7 +105,7 @@ class ParaferingService public function __construct( private readonly LoggerInterface $logger, ) { - } + }//end __construct() /** * Create a new voorstel linked to a case. @@ -119,18 +119,18 @@ public function __construct( public function createVoorstel(array $voorstelData): array { $voorstel = [ - 'id' => $voorstelData['id'] ?? $this->generateId(), - 'caseId' => $voorstelData['caseId'] ?? '', - 'type' => $voorstelData['type'] ?? 'collegeadvies', - 'onderwerp' => $voorstelData['onderwerp'] ?? '', - 'steller' => $voorstelData['steller'] ?? '', - 'afdeling' => $voorstelData['afdeling'] ?? '', + 'id' => $voorstelData['id'] ?? $this->generateId(), + 'caseId' => $voorstelData['caseId'] ?? '', + 'type' => $voorstelData['type'] ?? 'collegeadvies', + 'onderwerp' => $voorstelData['onderwerp'] ?? '', + 'steller' => $voorstelData['steller'] ?? '', + 'afdeling' => $voorstelData['afdeling'] ?? '', 'portefeuillehouder' => $voorstelData['portefeuillehouder'] ?? '', - 'status' => self::STATUS_CONCEPT, - 'currentStep' => 0, - 'parafeerRoute' => [], - 'auditTrail' => [], - 'createdAt' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), + 'status' => self::STATUS_CONCEPT, + 'currentStep' => 0, + 'parafeerRoute' => [], + 'auditTrail' => [], + 'createdAt' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), ]; $this->logger->info( @@ -139,13 +139,13 @@ public function createVoorstel(array $voorstelData): array ); return $voorstel; - } + }//end createVoorstel() /** * Start the parafering process on a voorstel. * - * @param array $voorstel The voorstel. - * @param array> $route The parafeerroute (ordered steps). + * @param array $voorstel The voorstel. + * @param array> $route The parafeerroute (ordered steps). * * @return array The updated voorstel with parafering started. * @@ -167,17 +167,17 @@ public function startParafering(array $voorstel, array $route): array throw new \InvalidArgumentException('Parafeerroute cannot be empty'); } - $voorstel['status'] = self::STATUS_IN_PARAFERING; - $voorstel['currentStep'] = 0; + $voorstel['status'] = self::STATUS_IN_PARAFERING; + $voorstel['currentStep'] = 0; $voorstel['parafeerRoute'] = $route; // Record in audit trail. $voorstel['auditTrail'][] = [ - 'action' => 'started', - 'actor' => $voorstel['steller'], + 'action' => 'started', + 'actor' => $voorstel['steller'], 'timestamp' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), - 'comment' => 'Parafering gestart', - 'step' => 0, + 'comment' => 'Parafering gestart', + 'step' => 0, ]; $this->logger->info( @@ -186,7 +186,7 @@ public function startParafering(array $voorstel, array $route): array ); return $voorstel; - } + }//end startParafering() /** * Execute a parafering action on a voorstel. @@ -207,8 +207,8 @@ public function executeAction( array $voorstel, string $action, string $actor, - string $comment = '', - ?string $namens = null, + string $comment='', + ?string $namens=null, ): array { if ($voorstel['status'] !== self::STATUS_IN_PARAFERING) { throw new \InvalidArgumentException('Voorstel is not in parafering status'); @@ -217,7 +217,7 @@ public function executeAction( $validActions = [self::ACTION_PARAFEREN, self::ACTION_TERUGSTUREN, self::ACTION_ADVISEREN]; if (!in_array($action, $validActions, true)) { throw new \InvalidArgumentException( - 'Invalid action: ' . $action . '. Valid: ' . implode(', ', $validActions) + 'Invalid action: '.$action.'. Valid: '.implode(', ', $validActions) ); } @@ -225,16 +225,16 @@ public function executeAction( // Record the action in audit trail. $auditEntry = [ - 'action' => $action, - 'actor' => $actor, + 'action' => $action, + 'actor' => $actor, 'timestamp' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), - 'comment' => $comment, - 'step' => $currentStep, + 'comment' => $comment, + 'step' => $currentStep, ]; if ($namens !== null) { - $auditEntry['namens'] = $namens; - $auditEntry['comment'] = "Geparafeerd door {$actor} namens {$namens} (mandaat). " . $comment; + $auditEntry['namens'] = $namens; + $auditEntry['comment'] = "Geparafeerd door {$actor} namens {$namens} (mandaat). ".$comment; } $voorstel['auditTrail'][] = $auditEntry; @@ -246,13 +246,13 @@ public function executeAction( 'Voorstel {id} returned by {actor}: {comment}', ['id' => $voorstel['id'], 'actor' => $actor, 'comment' => $comment] ); - } elseif ($action === self::ACTION_ADVISEREN) { + } else if ($action === self::ACTION_ADVISEREN) { // Advisory is non-blocking: advance to next step. $voorstel = $this->advanceStep($voorstel); - } elseif ($action === self::ACTION_PARAFEREN) { + } else if ($action === self::ACTION_PARAFEREN) { // Check if this completes a parallel step. - $route = $voorstel['parafeerRoute'] ?? []; - $step = $route[$currentStep] ?? []; + $route = $voorstel['parafeerRoute'] ?? []; + $step = $route[$currentStep] ?? []; $isParallel = $step['parallel'] ?? false; if ($isParallel) { @@ -260,10 +260,10 @@ public function executeAction( } else { $voorstel = $this->advanceStep($voorstel); } - } + }//end if return $voorstel; - } + }//end executeAction() /** * Get the full audit trail for a voorstel. @@ -277,7 +277,7 @@ public function executeAction( public function getAuditTrail(array $voorstel): array { return $voorstel['auditTrail'] ?? []; - } + }//end getAuditTrail() /** * Get the current step information for a voorstel. @@ -294,11 +294,11 @@ public function getCurrentStep(array $voorstel): ?array return null; } - $route = $voorstel['parafeerRoute'] ?? []; + $route = $voorstel['parafeerRoute'] ?? []; $currentStep = $voorstel['currentStep'] ?? 0; return $route[$currentStep] ?? null; - } + }//end getCurrentStep() /** * Override (modify) the parafeerroute for a specific voorstel. @@ -321,11 +321,11 @@ public function overrideRoute( $voorstel['parafeerRoute'] = $newRoute; $voorstel['auditTrail'][] = [ - 'action' => 'route_overridden', - 'actor' => $actor, + 'action' => 'route_overridden', + 'actor' => $actor, 'timestamp' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), - 'comment' => "Parafeerroute aangepast door {$actor}, reden: {$reason}", - 'step' => $voorstel['currentStep'] ?? 0, + 'comment' => "Parafeerroute aangepast door {$actor}, reden: {$reason}", + 'step' => $voorstel['currentStep'] ?? 0, ]; $this->logger->info( @@ -334,7 +334,7 @@ public function overrideRoute( ); return $voorstel; - } + }//end overrideRoute() /** * Advance to the next step in the parafeerroute. @@ -345,18 +345,18 @@ public function overrideRoute( */ private function advanceStep(array $voorstel): array { - $route = $voorstel['parafeerRoute'] ?? []; + $route = $voorstel['parafeerRoute'] ?? []; $nextStep = ($voorstel['currentStep'] ?? 0) + 1; if ($nextStep >= count($route)) { // All steps completed. - $voorstel['status'] = self::STATUS_GEPARAFEERD; + $voorstel['status'] = self::STATUS_GEPARAFEERD; $voorstel['auditTrail'][] = [ - 'action' => 'completed', - 'actor' => 'system', + 'action' => 'completed', + 'actor' => 'system', 'timestamp' => (new \DateTimeImmutable())->format(\DateTimeInterface::ATOM), - 'comment' => 'Alle paraferingstappen voltooid', - 'step' => $nextStep, + 'comment' => 'Alle paraferingstappen voltooid', + 'step' => $nextStep, ]; $this->logger->info('Voorstel {id} parafering completed', ['id' => $voorstel['id']]); } else { @@ -364,25 +364,25 @@ private function advanceStep(array $voorstel): array } return $voorstel; - } + }//end advanceStep() /** * Handle a parallel parafering step (completes when ALL actors have parafered). * - * @param array $voorstel The voorstel. - * @param string $actor The actor who just parafered. - * @param int $stepIndex The step index. + * @param array $voorstel The voorstel. + * @param string $actor The actor who just parafered. + * @param int $stepIndex The step index. * * @return array The updated voorstel. */ private function handleParallelStep(array $voorstel, string $actor, int $stepIndex): array { - $route = $voorstel['parafeerRoute'] ?? []; - $step = $route[$stepIndex] ?? []; + $route = $voorstel['parafeerRoute'] ?? []; + $step = $route[$stepIndex] ?? []; $requiredActors = $step['actors'] ?? []; // Check which actors have already parafered for this step. - $auditTrail = $voorstel['auditTrail'] ?? []; + $auditTrail = $voorstel['auditTrail'] ?? []; $paraferedActors = []; foreach ($auditTrail as $entry) { if (($entry['step'] ?? -1) === $stepIndex @@ -407,7 +407,7 @@ private function handleParallelStep(array $voorstel, string $actor, int $stepInd } return $voorstel; - } + }//end handleParallelStep() /** * Generate a unique ID. @@ -427,5 +427,5 @@ private function generateId(): string mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); - } -} + }//end generateId() +}//end class diff --git a/lib/Service/StufFieldMappingService.php b/lib/Service/StufFieldMappingService.php index de096911..f13a6d6a 100644 --- a/lib/Service/StufFieldMappingService.php +++ b/lib/Service/StufFieldMappingService.php @@ -52,15 +52,15 @@ class StufFieldMappingService * @var array */ private const DEFAULT_ZKN_MAPPINGS = [ - 'identificatie' => ['property' => 'identifier', 'transform' => null], - 'omschrijving' => ['property' => 'title', 'transform' => null], - 'toelichting' => ['property' => 'description', 'transform' => null], - 'startdatum' => ['property' => 'startDate', 'transform' => 'stufDateToIso'], - 'einddatum' => ['property' => 'endDate', 'transform' => 'stufDateToIso'], - 'einddatumGepland' => ['property' => 'plannedEndDate', 'transform' => 'stufDateToIso'], + 'identificatie' => ['property' => 'identifier', 'transform' => null], + 'omschrijving' => ['property' => 'title', 'transform' => null], + 'toelichting' => ['property' => 'description', 'transform' => null], + 'startdatum' => ['property' => 'startDate', 'transform' => 'stufDateToIso'], + 'einddatum' => ['property' => 'endDate', 'transform' => 'stufDateToIso'], + 'einddatumGepland' => ['property' => 'plannedEndDate', 'transform' => 'stufDateToIso'], 'uiterlijkeEinddatumAfdoening' => ['property' => 'deadline', 'transform' => 'stufDateToIso'], - 'registratiedatum' => ['property' => 'registrationDate', 'transform' => 'stufDateToIso'], - 'vertrouwelijkAanduiding' => ['property' => 'confidentiality', 'transform' => 'confidentialityToInternal'], + 'registratiedatum' => ['property' => 'registrationDate', 'transform' => 'stufDateToIso'], + 'vertrouwelijkAanduiding' => ['property' => 'confidentiality', 'transform' => 'confidentialityToInternal'], ]; /** @@ -69,11 +69,11 @@ class StufFieldMappingService * @var array */ private const DEFAULT_BG_MAPPINGS = [ - 'inp.bsn' => ['property' => 'bsn', 'transform' => null], - 'geslachtsnaam' => ['property' => 'lastName', 'transform' => null], + 'inp.bsn' => ['property' => 'bsn', 'transform' => null], + 'geslachtsnaam' => ['property' => 'lastName', 'transform' => null], 'voorvoegselGeslachtsnaam' => ['property' => 'namePrefix', 'transform' => null], - 'voornamen' => ['property' => 'firstName', 'transform' => null], - 'geboortedatum' => ['property' => 'dateOfBirth', 'transform' => 'stufDateToIso'], + 'voornamen' => ['property' => 'firstName', 'transform' => null], + 'geboortedatum' => ['property' => 'dateOfBirth', 'transform' => 'stufDateToIso'], ]; /** @@ -82,14 +82,14 @@ class StufFieldMappingService * @var array */ private const CONFIDENTIALITY_MAP = [ - 'OPENBAAR' => 'public', - 'BEPERKT OPENBAAR' => 'restricted', - 'INTERN' => 'internal', + 'OPENBAAR' => 'public', + 'BEPERKT OPENBAAR' => 'restricted', + 'INTERN' => 'internal', 'ZAAKVERTROUWELIJK' => 'case_sensitive', - 'VERTROUWELIJK' => 'confidential', - 'CONFIDENTIEEL' => 'highly_confidential', - 'GEHEIM' => 'secret', - 'ZEER GEHEIM' => 'top_secret', + 'VERTROUWELIJK' => 'confidential', + 'CONFIDENTIEEL' => 'highly_confidential', + 'GEHEIM' => 'secret', + 'ZEER GEHEIM' => 'top_secret', ]; /** @@ -107,7 +107,7 @@ class StufFieldMappingService public function __construct( private readonly LoggerInterface $logger, ) { - } + }//end __construct() /** * Map StUF-ZKN fields to OpenRegister case properties. @@ -126,7 +126,7 @@ public function mapZknToInternal(array $stufData): array ); return $this->applyMappings($stufData, $mappings, 'toInternal'); - } + }//end mapZknToInternal() /** * Map OpenRegister case properties to StUF-ZKN fields. @@ -145,7 +145,7 @@ public function mapInternalToZkn(array $internalData): array ); return $this->applyReverseMappings($internalData, $mappings); - } + }//end mapInternalToZkn() /** * Map StUF-BG fields to OpenRegister person properties. @@ -164,7 +164,7 @@ public function mapBgToInternal(array $stufData): array ); return $this->applyMappings($stufData, $mappings, 'toInternal'); - } + }//end mapBgToInternal() /** * Map OpenRegister person properties to StUF-BG fields. @@ -183,7 +183,7 @@ public function mapInternalToBg(array $internalData): array ); return $this->applyReverseMappings($internalData, $mappings); - } + }//end mapInternalToBg() /** * Convert a StUF date (YYYYMMDD) to ISO 8601 (YYYY-MM-DD). @@ -212,7 +212,7 @@ public function stufDateToIso(string $stufDate): ?string $this->logger->warning('Invalid StUF date format: {date}', ['date' => $stufDate]); return null; - } + }//end stufDateToIso() /** * Convert an ISO 8601 date to StUF date format (YYYYMMDD). @@ -227,7 +227,7 @@ public function isoToStufDate(string $isoDate): string { $dt = new \DateTimeImmutable($isoDate); return $dt->format(self::STUF_DATE_FORMAT); - } + }//end isoToStufDate() /** * Convert an ISO 8601 datetime to StUF datetime format (YYYYMMDDHHmmss). @@ -242,7 +242,7 @@ public function isoToStufDateTime(string $isoDateTime): string { $dt = new \DateTimeImmutable($isoDateTime); return $dt->format(self::STUF_DATETIME_FORMAT); - } + }//end isoToStufDateTime() /** * Convert a StUF confidentiality value to internal value. @@ -256,7 +256,7 @@ public function isoToStufDateTime(string $isoDateTime): string public function confidentialityToInternal(string $stufValue): string { return self::CONFIDENTIALITY_MAP[strtoupper($stufValue)] ?? $stufValue; - } + }//end confidentialityToInternal() /** * Convert an internal confidentiality value to StUF value. @@ -271,12 +271,12 @@ public function confidentialityToStuf(string $internalValue): string { $flipped = array_flip(self::CONFIDENTIALITY_MAP); return $flipped[$internalValue] ?? strtoupper($internalValue); - } + }//end confidentialityToStuf() /** * Add custom field mappings. * - * @param string $type The mapping type ('zkn' or 'bg'). + * @param string $type The mapping type ('zkn' or 'bg'). * @param array $mappings The custom mappings. * * @return void @@ -289,7 +289,7 @@ public function addCustomMappings(string $type, array $mappings): void $this->customMappings[$type] ?? [], $mappings ); - } + }//end addCustomMappings() /** * Get all default mappings for a type. @@ -307,14 +307,14 @@ public function getDefaultMappings(string $type): array 'bg' => self::DEFAULT_BG_MAPPINGS, default => [], }; - } + }//end getDefaultMappings() /** * Apply mappings to convert StUF data to internal format. * - * @param array $data The source data. + * @param array $data The source data. * @param array $mappings The field mappings. - * @param string $direction The direction ('toInternal'). + * @param string $direction The direction ('toInternal'). * * @return array The mapped data. */ @@ -327,8 +327,8 @@ private function applyMappings(array $data, array $mappings, string $direction): continue; } - $mapping = $mappings[$stufField]; - $property = $mapping['property']; + $mapping = $mappings[$stufField]; + $property = $mapping['property']; $transform = $mapping['transform']; if ($transform !== null && method_exists($this, $transform)) { @@ -339,12 +339,12 @@ private function applyMappings(array $data, array $mappings, string $direction): } return $result; - } + }//end applyMappings() /** * Apply reverse mappings to convert internal data to StUF format. * - * @param array $data The internal data. + * @param array $data The internal data. * @param array $mappings The field mappings. * * @return array The StUF data. @@ -367,21 +367,21 @@ private function applyReverseMappings(array $data, array $mappings): array continue; } - $info = $reverseLookup[$property]; + $info = $reverseLookup[$property]; $stufField = $info['stufField']; // Apply reverse transform. if ($value !== null && $info['transform'] !== null) { $value = match ($info['transform']) { - 'stufDateToIso' => $this->isoToStufDate((string)$value), - 'confidentialityToInternal' => $this->confidentialityToStuf((string)$value), - default => (string)$value, + 'stufDateToIso' => $this->isoToStufDate((string) $value), + 'confidentialityToInternal' => $this->confidentialityToStuf((string) $value), + default => (string) $value, }; } - $result[$stufField] = (string)($value ?? ''); + $result[$stufField] = (string) ($value ?? ''); } return $result; - } -} + }//end applyReverseMappings() +}//end class diff --git a/lib/Service/StufMessageBuilder.php b/lib/Service/StufMessageBuilder.php index f79f79eb..fb68a8f3 100644 --- a/lib/Service/StufMessageBuilder.php +++ b/lib/Service/StufMessageBuilder.php @@ -65,9 +65,9 @@ class StufMessageBuilder * @var array */ public const NO_VALUE_TYPES = [ - 'geenWaarde' => 'geenWaarde', - 'waardeOnbekend' => 'waardeOnbekend', - 'nietOndersteund' => 'nietOndersteund', + 'geenWaarde' => 'geenWaarde', + 'waardeOnbekend' => 'waardeOnbekend', + 'nietOndersteund' => 'nietOndersteund', 'vastgesteldOnbekend' => 'vastgesteldOnbekend', ]; @@ -79,7 +79,7 @@ class StufMessageBuilder public function __construct( private readonly LoggerInterface $logger, ) { - } + }//end __construct() /** * Build a complete SOAP envelope wrapping a StUF message body. @@ -116,13 +116,13 @@ public function buildSoapEnvelope(string $bodyXml): string } return $dom->saveXML() ?: ''; - } + }//end buildSoapEnvelope() /** * Build stuurgegevens XML element. * - * @param array $zender Sender info (organisatie, applicatie). - * @param array $ontvanger Receiver info (organisatie, applicatie). + * @param array $zender Sender info (organisatie, applicatie). + * @param array $ontvanger Receiver info (organisatie, applicatie). * @param string|null $referentienummer Reference number (auto-generated if null). * * @return string The stuurgegevens XML fragment. @@ -132,27 +132,27 @@ public function buildSoapEnvelope(string $bodyXml): string public function buildStuurgegevens( array $zender, array $ontvanger, - ?string $referentienummer = null, + ?string $referentienummer=null, ): string { - $refNr = $referentienummer ?? $this->generateUuid(); + $refNr = $referentienummer ?? $this->generateUuid(); $tijdstip = (new \DateTimeImmutable())->format('YmdHis'); - $xml = ''; + $xml = ''; $xml .= 'Lk01'; $xml .= ''; - $xml .= '' . htmlspecialchars($zender['organisatie'] ?? '') . ''; - $xml .= '' . htmlspecialchars($zender['applicatie'] ?? '') . ''; + $xml .= ''.htmlspecialchars($zender['organisatie'] ?? '').''; + $xml .= ''.htmlspecialchars($zender['applicatie'] ?? '').''; $xml .= ''; $xml .= ''; - $xml .= '' . htmlspecialchars($ontvanger['organisatie'] ?? '') . ''; - $xml .= '' . htmlspecialchars($ontvanger['applicatie'] ?? '') . ''; + $xml .= ''.htmlspecialchars($ontvanger['organisatie'] ?? '').''; + $xml .= ''.htmlspecialchars($ontvanger['applicatie'] ?? '').''; $xml .= ''; - $xml .= '' . htmlspecialchars($refNr) . ''; - $xml .= '' . $tijdstip . ''; + $xml .= ''.htmlspecialchars($refNr).''; + $xml .= ''.$tijdstip.''; $xml .= ''; return $xml; - } + }//end buildStuurgegevens() /** * Build a StUF Bv01 (bevestigingsbericht) response. @@ -172,25 +172,25 @@ public function buildBv01( ): string { $tijdstip = (new \DateTimeImmutable())->format('YmdHis'); - $body = ''; + $body = ''; $body .= ''; $body .= 'Bv01'; $body .= ''; - $body .= '' . htmlspecialchars($zender['organisatie'] ?? '') . ''; - $body .= '' . htmlspecialchars($zender['applicatie'] ?? '') . ''; + $body .= ''.htmlspecialchars($zender['organisatie'] ?? '').''; + $body .= ''.htmlspecialchars($zender['applicatie'] ?? '').''; $body .= ''; $body .= ''; - $body .= '' . htmlspecialchars($ontvanger['organisatie'] ?? '') . ''; - $body .= '' . htmlspecialchars($ontvanger['applicatie'] ?? '') . ''; + $body .= ''.htmlspecialchars($ontvanger['organisatie'] ?? '').''; + $body .= ''.htmlspecialchars($ontvanger['applicatie'] ?? '').''; $body .= ''; - $body .= '' . htmlspecialchars($this->generateUuid()) . ''; - $body .= '' . $tijdstip . ''; - $body .= '' . htmlspecialchars($crossRef) . ''; + $body .= ''.htmlspecialchars($this->generateUuid()).''; + $body .= ''.$tijdstip.''; + $body .= ''.htmlspecialchars($crossRef).''; $body .= ''; $body .= ''; return $this->buildSoapEnvelope($body); - } + }//end buildBv01() /** * Build a StUF Fo01 (foutbericht) fault response. @@ -214,29 +214,29 @@ public function buildFo01( ): string { $tijdstip = (new \DateTimeImmutable())->format('YmdHis'); - $body = ''; + $body = ''; $body .= ''; $body .= 'Fo01'; $body .= ''; - $body .= '' . htmlspecialchars($zender['organisatie'] ?? '') . ''; - $body .= '' . htmlspecialchars($zender['applicatie'] ?? '') . ''; + $body .= ''.htmlspecialchars($zender['organisatie'] ?? '').''; + $body .= ''.htmlspecialchars($zender['applicatie'] ?? '').''; $body .= ''; $body .= ''; - $body .= '' . htmlspecialchars($ontvanger['organisatie'] ?? '') . ''; - $body .= '' . htmlspecialchars($ontvanger['applicatie'] ?? '') . ''; + $body .= ''.htmlspecialchars($ontvanger['organisatie'] ?? '').''; + $body .= ''.htmlspecialchars($ontvanger['applicatie'] ?? '').''; $body .= ''; - $body .= '' . htmlspecialchars($this->generateUuid()) . ''; - $body .= '' . $tijdstip . ''; + $body .= ''.htmlspecialchars($this->generateUuid()).''; + $body .= ''.$tijdstip.''; $body .= ''; $body .= ''; - $body .= '' . htmlspecialchars($foutcode) . ''; - $body .= '' . htmlspecialchars($plek) . ''; - $body .= '' . htmlspecialchars($foutbeschrijving) . ''; + $body .= ''.htmlspecialchars($foutcode).''; + $body .= ''.htmlspecialchars($plek).''; + $body .= ''.htmlspecialchars($foutbeschrijving).''; $body .= ''; $body .= ''; return $this->buildSoapEnvelope($body); - } + }//end buildFo01() /** * Build a SOAP Fault response for invalid XML. @@ -269,7 +269,7 @@ public function buildSoapFault(string $faultString): string $fault->appendChild($faultstringEl); return $dom->saveXML() ?: ''; - } + }//end buildSoapFault() /** * Generate a UUID. @@ -289,5 +289,5 @@ private function generateUuid(): string mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); - } -} + }//end generateUuid() +}//end class diff --git a/lib/Service/TemplateLibraryService.php b/lib/Service/TemplateLibraryService.php index 862785cc..5fb218eb 100644 --- a/lib/Service/TemplateLibraryService.php +++ b/lib/Service/TemplateLibraryService.php @@ -35,8 +35,7 @@ class TemplateLibraryService /** * Path to the templates directory. */ - private const TEMPLATES_DIR = __DIR__ . '/../Settings/templates'; - + private const TEMPLATES_DIR = __DIR__.'/../Settings/templates'; /** * Constructor. @@ -48,8 +47,7 @@ public function __construct( private readonly SettingsService $settingsService, private readonly LoggerInterface $logger, ) { - } - + }//end __construct() /** * List all available zaaktype templates. @@ -67,7 +65,7 @@ public function listTemplates(): array return $templates; } - $files = glob($dir . '/*.json'); + $files = glob($dir.'/*.json'); if ($files === false) { return $templates; } @@ -81,7 +79,7 @@ public function listTemplates(): array $data = json_decode($content, true); if (json_last_error() !== JSON_ERROR_NONE || is_array($data) === false) { $this->logger->warning( - 'Invalid template file: ' . basename($file), + 'Invalid template file: '.basename($file), ['app' => Application::APP_ID] ); continue; @@ -95,11 +93,10 @@ public function listTemplates(): array 'version' => $data['version'] ?? '1.0.0', 'file' => basename($file), ]; - } + }//end foreach return $templates; - } - + }//end listTemplates() /** * Load a template by its ID. @@ -116,7 +113,7 @@ public function loadTemplate(string $templateId): ?array return null; } - $files = glob($dir . '/*.json'); + $files = glob($dir.'/*.json'); if ($files === false) { return null; } @@ -139,8 +136,7 @@ public function loadTemplate(string $templateId): ?array } return null; - } - + }//end loadTemplate() /** * Activate a template by creating OpenRegister objects for the case type and related entities. @@ -163,7 +159,7 @@ public function activateTemplate(string $templateId): array { $template = $this->loadTemplate($templateId); if ($template === null) { - throw new \RuntimeException('Template not found: ' . $templateId); + throw new \RuntimeException('Template not found: '.$templateId); } $objectService = $this->settingsService->getObjectService(); @@ -187,21 +183,21 @@ public function activateTemplate(string $templateId): array ]; // Create the case type. - $caseTypeSchema = $this->settingsService->getConfigValue('case_type_schema'); - $caseTypeData = $template['caseType'] ?? []; - $caseType = $objectService->saveObject( + $caseTypeSchema = $this->settingsService->getConfigValue('case_type_schema'); + $caseTypeData = $template['caseType'] ?? []; + $caseType = $objectService->saveObject( $register, $caseTypeSchema, $caseTypeData, ); - $caseTypeId = $caseType->getUuid(); + $caseTypeId = $caseType->getUuid(); $result['caseType'] = $caseTypeId; // Create status types. $statusTypeSchema = $this->settingsService->getConfigValue('status_type_schema'); foreach (($template['statusTypes'] ?? []) as $statusData) { $statusData['caseType'] = $caseTypeId; - $status = $objectService->saveObject( + $status = $objectService->saveObject( $register, $statusTypeSchema, $statusData, @@ -213,7 +209,7 @@ public function activateTemplate(string $templateId): array $propertySchema = $this->settingsService->getConfigValue('property_definition_schema'); foreach (($template['propertyDefinitions'] ?? []) as $propData) { $propData['caseType'] = $caseTypeId; - $prop = $objectService->saveObject( + $prop = $objectService->saveObject( $register, $propertySchema, $propData, @@ -225,7 +221,7 @@ public function activateTemplate(string $templateId): array $docTypeSchema = $this->settingsService->getConfigValue('document_type_schema'); foreach (($template['documentTypes'] ?? []) as $docData) { $docData['caseType'] = $caseTypeId; - $doc = $objectService->saveObject( + $doc = $objectService->saveObject( $register, $docTypeSchema, $docData, @@ -237,7 +233,7 @@ public function activateTemplate(string $templateId): array $decisionTypeSchema = $this->settingsService->getConfigValue('decision_type_schema'); foreach (($template['decisionTypes'] ?? []) as $decData) { $decData['caseType'] = $caseTypeId; - $dec = $objectService->saveObject( + $dec = $objectService->saveObject( $register, $decisionTypeSchema, $decData, @@ -249,7 +245,7 @@ public function activateTemplate(string $templateId): array $roleTypeSchema = $this->settingsService->getConfigValue('role_type_schema'); foreach (($template['roleTypes'] ?? []) as $roleData) { $roleData['caseType'] = $caseTypeId; - $role = $objectService->saveObject( + $role = $objectService->saveObject( $register, $roleTypeSchema, $roleData, @@ -258,10 +254,10 @@ public function activateTemplate(string $templateId): array } $this->logger->info( - 'Template activated: ' . $templateId . ' -> caseType ' . $caseTypeId, + 'Template activated: '.$templateId.' -> caseType '.$caseTypeId, ['app' => Application::APP_ID] ); return $result; - } -} + }//end activateTemplate() +}//end class diff --git a/lib/Service/TenantService.php b/lib/Service/TenantService.php index 36aebde4..3a957042 100644 --- a/lib/Service/TenantService.php +++ b/lib/Service/TenantService.php @@ -48,8 +48,8 @@ class TenantService * @param IAppManager $appManager The app manager * @param IGroupManager $groupManager The Nextcloud group manager * @param IUserManager $userManager The Nextcloud user manager - * @param ContainerInterface $container The DI container - * @param LoggerInterface $logger The logger + * @param ContainerInterface $container The DI container + * @param LoggerInterface $logger The logger * * @return void */ @@ -205,10 +205,12 @@ public function provisionTenant(string $tenantId): array // Create a dedicated register for this tenant. try { $registerService = $this->container->get('OCA\OpenRegister\Service\RegisterService'); - $newRegister = $registerService->createFromArray([ - 'title' => 'Procest - '.$tenantData['name'], - 'description' => 'Case management register for '.$tenantData['name'], - ]); + $newRegister = $registerService->createFromArray( + [ + 'title' => 'Procest - '.$tenantData['name'], + 'description' => 'Case management register for '.$tenantData['name'], + ] + ); $tenantData['registerId'] = (string) $newRegister->getId(); } catch (\Exception $e) { diff --git a/lib/Service/ZgwZrcRulesService.php b/lib/Service/ZgwZrcRulesService.php index 837270d0..52575e9e 100644 --- a/lib/Service/ZgwZrcRulesService.php +++ b/lib/Service/ZgwZrcRulesService.php @@ -145,7 +145,7 @@ public function rulesZakenCreate(array $body): array register: $register, schema: $schema ); - $ztData = is_array($zaaktype) === true ? $zaaktype : $zaaktype->jsonSerialize(); + $ztData = is_array($zaaktype) === true ? $zaaktype : $zaaktype->jsonSerialize(); if (empty($ztData['defaultAssignee']) === false) { $body['assignee'] = $ztData['defaultAssignee']; } @@ -154,7 +154,7 @@ public function rulesZakenCreate(array $body): array } } } - } + }//end if return $this->validateZaakFields(result: $this->isValid(body: $body), existingObject: null, isPatch: false); }//end rulesZakenCreate() From 6a2fbd6981a43ad0ecb9764e5063e690d26bb1aa Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 20 Apr 2026 07:36:45 +0200 Subject: [PATCH 2/6] =?UTF-8?q?fix(headers):=20@author=20email=20typo=20de?= =?UTF-8?q?v@conductio.nl=20=E2=86=92=20info@conduction.nl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Literal string replacement in docblock @author tags. Template fix in nextcloud-app-template PR #19 prevents recurrence. --- lib/AppInfo/Application.php | 2 +- lib/BackgroundJob/ShareMaintenanceJob.php | 2 +- lib/Controller/AcController.php | 2 +- lib/Controller/AiController.php | 2 +- lib/Controller/BrcController.php | 2 +- lib/Controller/CaseDefinitionController.php | 2 +- lib/Controller/CaseSharingController.php | 2 +- lib/Controller/ConsultationController.php | 2 +- lib/Controller/DashboardController.php | 2 +- lib/Controller/DrcController.php | 2 +- lib/Controller/EmailController.php | 2 +- lib/Controller/GisProxyController.php | 2 +- lib/Controller/HealthController.php | 2 +- lib/Controller/InspectionController.php | 2 +- lib/Controller/LegesController.php | 2 +- lib/Controller/MetricsController.php | 2 +- lib/Controller/MilestoneController.php | 2 +- lib/Controller/NrcController.php | 2 +- lib/Controller/ParaferingController.php | 2 +- lib/Controller/PublicShareController.php | 2 +- lib/Controller/SettingsController.php | 2 +- lib/Controller/StufController.php | 2 +- lib/Controller/TemplateController.php | 2 +- lib/Controller/TenantController.php | 2 +- lib/Controller/ZgwMappingController.php | 2 +- lib/Controller/ZrcController.php | 2 +- lib/Controller/ZtcController.php | 2 +- lib/Dashboard/CasesOverviewWidget.php | 2 +- lib/Dashboard/DeadlineAlertsWidget.php | 2 +- lib/Dashboard/MyTasksWidget.php | 2 +- lib/Dashboard/OverdueCasesWidget.php | 2 +- lib/Dashboard/StalledCasesWidget.php | 2 +- lib/Dashboard/StartCaseWidget.php | 2 +- lib/Dashboard/TaskRemindersWidget.php | 2 +- lib/Listener/DeepLinkRegistrationListener.php | 2 +- lib/Middleware/TenantMiddleware.php | 2 +- lib/Middleware/ZgwAuthException.php | 2 +- lib/Middleware/ZgwAuthMiddleware.php | 2 +- lib/Repair/InitializeSettings.php | 2 +- lib/Repair/LoadDefaultZgwMappings.php | 2 +- lib/Repair/SeedBezwaarBeroepData.php | 2 +- lib/Sections/SettingsSection.php | 2 +- lib/Service/AiService.php | 2 +- lib/Service/CaseDefinitionExportService.php | 2 +- lib/Service/CaseDefinitionImportService.php | 2 +- lib/Service/CaseEmailService.php | 2 +- lib/Service/CaseSharingService.php | 2 +- lib/Service/CaseTransferService.php | 2 +- lib/Service/ChecklistService.php | 2 +- lib/Service/ConsultationService.php | 2 +- lib/Service/DsoIntakeService.php | 2 +- lib/Service/GisProxyService.php | 2 +- lib/Service/InspectionService.php | 2 +- lib/Service/LegesCalculationService.php | 2 +- lib/Service/LegesExportService.php | 2 +- lib/Service/MilestoneService.php | 2 +- lib/Service/NotificatieService.php | 2 +- lib/Service/ParaferingNotificationService.php | 2 +- lib/Service/ParaferingService.php | 2 +- lib/Service/SeedDataService.php | 2 +- lib/Service/SettingsService.php | 2 +- lib/Service/StufFieldMappingService.php | 2 +- lib/Service/StufMessageBuilder.php | 2 +- lib/Service/TemplateLibraryService.php | 2 +- lib/Service/TenantService.php | 2 +- lib/Service/ZgwBrcRulesService.php | 2 +- lib/Service/ZgwBusinessRulesService.php | 2 +- lib/Service/ZgwDocumentService.php | 2 +- lib/Service/ZgwDrcRulesService.php | 2 +- lib/Service/ZgwMappingService.php | 2 +- lib/Service/ZgwPaginationHelper.php | 2 +- lib/Service/ZgwRulesBase.php | 2 +- lib/Service/ZgwService.php | 2 +- lib/Service/ZgwZrcRulesService.php | 2 +- lib/Service/ZgwZtcRulesService.php | 2 +- lib/Settings/AdminSettings.php | 2 +- tests/Unit/Controller/GisProxyControllerTest.php | 2 +- tests/Unit/Controller/HealthControllerTest.php | 2 +- tests/Unit/Controller/MetricsControllerTest.php | 2 +- tests/Unit/Dashboard/SignaleringWidgetsTest.php | 2 +- tests/Unit/Middleware/ZgwAuthMiddlewareTest.php | 2 +- tests/Unit/Repair/SeedBezwaarBeroepDataTest.php | 2 +- tests/Unit/Service/GisProxyServiceTest.php | 2 +- tests/Unit/Service/ParaferingNotificationServiceTest.php | 2 +- tests/Unit/Service/SeedDataServiceTest.php | 2 +- tests/Unit/Service/SettingsServiceTest.php | 2 +- tests/Unit/Service/VthSettingsServiceTest.php | 2 +- tests/Unit/Service/ZgwMappingServiceTest.php | 2 +- tests/Unit/Service/ZgwPaginationHelperTest.php | 2 +- tests/Unit/Service/ZgwZrcRulesServiceTest.php | 2 +- tests/Unit/Settings/VthSchemaTest.php | 2 +- tests/Unit/Settings/WorkflowEngineSchemaTest.php | 2 +- tests/bootstrap.php | 2 +- 93 files changed, 93 insertions(+), 93 deletions(-) diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 898b925c..114f2cf6 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -8,7 +8,7 @@ * @category AppInfo * @package OCA\Procest\AppInfo * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/BackgroundJob/ShareMaintenanceJob.php b/lib/BackgroundJob/ShareMaintenanceJob.php index 933f2fd1..c422589a 100644 --- a/lib/BackgroundJob/ShareMaintenanceJob.php +++ b/lib/BackgroundJob/ShareMaintenanceJob.php @@ -8,7 +8,7 @@ * @category BackgroundJob * @package OCA\Procest\BackgroundJob * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/AcController.php b/lib/Controller/AcController.php index 09e0719c..6e91e9c0 100644 --- a/lib/Controller/AcController.php +++ b/lib/Controller/AcController.php @@ -10,7 +10,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/AiController.php b/lib/Controller/AiController.php index 4339c066..f1fb721f 100644 --- a/lib/Controller/AiController.php +++ b/lib/Controller/AiController.php @@ -10,7 +10,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/BrcController.php b/lib/Controller/BrcController.php index a28375fb..706699db 100644 --- a/lib/Controller/BrcController.php +++ b/lib/Controller/BrcController.php @@ -10,7 +10,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/CaseDefinitionController.php b/lib/Controller/CaseDefinitionController.php index 22b5adfa..c3d36b25 100644 --- a/lib/Controller/CaseDefinitionController.php +++ b/lib/Controller/CaseDefinitionController.php @@ -9,7 +9,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/CaseSharingController.php b/lib/Controller/CaseSharingController.php index 4a895837..e98a4b96 100644 --- a/lib/Controller/CaseSharingController.php +++ b/lib/Controller/CaseSharingController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/ConsultationController.php b/lib/Controller/ConsultationController.php index 159755fa..316e28ea 100644 --- a/lib/Controller/ConsultationController.php +++ b/lib/Controller/ConsultationController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/DashboardController.php b/lib/Controller/DashboardController.php index 07a5c5c6..0b6664ca 100644 --- a/lib/Controller/DashboardController.php +++ b/lib/Controller/DashboardController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/DrcController.php b/lib/Controller/DrcController.php index 805d6394..64e7954c 100644 --- a/lib/Controller/DrcController.php +++ b/lib/Controller/DrcController.php @@ -10,7 +10,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/EmailController.php b/lib/Controller/EmailController.php index 4099c7d6..55863180 100644 --- a/lib/Controller/EmailController.php +++ b/lib/Controller/EmailController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/GisProxyController.php b/lib/Controller/GisProxyController.php index 078e4518..0da26c64 100644 --- a/lib/Controller/GisProxyController.php +++ b/lib/Controller/GisProxyController.php @@ -9,7 +9,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/HealthController.php b/lib/Controller/HealthController.php index 1d499218..42ebb8b2 100644 --- a/lib/Controller/HealthController.php +++ b/lib/Controller/HealthController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/InspectionController.php b/lib/Controller/InspectionController.php index 24c8a07c..300c6b52 100644 --- a/lib/Controller/InspectionController.php +++ b/lib/Controller/InspectionController.php @@ -9,7 +9,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/LegesController.php b/lib/Controller/LegesController.php index 1c3dc494..9f796367 100644 --- a/lib/Controller/LegesController.php +++ b/lib/Controller/LegesController.php @@ -9,7 +9,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/MetricsController.php b/lib/Controller/MetricsController.php index ed658a2e..e3ef8716 100644 --- a/lib/Controller/MetricsController.php +++ b/lib/Controller/MetricsController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/MilestoneController.php b/lib/Controller/MilestoneController.php index 1eb00d78..0bc70d20 100644 --- a/lib/Controller/MilestoneController.php +++ b/lib/Controller/MilestoneController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/NrcController.php b/lib/Controller/NrcController.php index e90ab64a..025275a7 100644 --- a/lib/Controller/NrcController.php +++ b/lib/Controller/NrcController.php @@ -10,7 +10,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/ParaferingController.php b/lib/Controller/ParaferingController.php index d2fd9983..d129b3f8 100644 --- a/lib/Controller/ParaferingController.php +++ b/lib/Controller/ParaferingController.php @@ -9,7 +9,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/PublicShareController.php b/lib/Controller/PublicShareController.php index 0f3df9d9..ca2982b8 100644 --- a/lib/Controller/PublicShareController.php +++ b/lib/Controller/PublicShareController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/SettingsController.php b/lib/Controller/SettingsController.php index 9ca9ca68..389fe742 100644 --- a/lib/Controller/SettingsController.php +++ b/lib/Controller/SettingsController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/StufController.php b/lib/Controller/StufController.php index 8976d89c..266cfcaf 100644 --- a/lib/Controller/StufController.php +++ b/lib/Controller/StufController.php @@ -10,7 +10,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/TemplateController.php b/lib/Controller/TemplateController.php index e8fd7d6c..a19e2424 100644 --- a/lib/Controller/TemplateController.php +++ b/lib/Controller/TemplateController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/TenantController.php b/lib/Controller/TenantController.php index 0bc7acec..67e12cec 100644 --- a/lib/Controller/TenantController.php +++ b/lib/Controller/TenantController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/ZgwMappingController.php b/lib/Controller/ZgwMappingController.php index 054a8629..7517066b 100644 --- a/lib/Controller/ZgwMappingController.php +++ b/lib/Controller/ZgwMappingController.php @@ -8,7 +8,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/ZrcController.php b/lib/Controller/ZrcController.php index 5cbb6dd6..b9675a27 100644 --- a/lib/Controller/ZrcController.php +++ b/lib/Controller/ZrcController.php @@ -13,7 +13,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Controller/ZtcController.php b/lib/Controller/ZtcController.php index a3c881c7..41b6097a 100644 --- a/lib/Controller/ZtcController.php +++ b/lib/Controller/ZtcController.php @@ -11,7 +11,7 @@ * @category Controller * @package OCA\Procest\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Dashboard/CasesOverviewWidget.php b/lib/Dashboard/CasesOverviewWidget.php index 5bbb768f..159424a1 100644 --- a/lib/Dashboard/CasesOverviewWidget.php +++ b/lib/Dashboard/CasesOverviewWidget.php @@ -8,7 +8,7 @@ * @category Dashboard * @package OCA\Procest\Dashboard * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Dashboard/DeadlineAlertsWidget.php b/lib/Dashboard/DeadlineAlertsWidget.php index 382145fc..d95cc5b9 100644 --- a/lib/Dashboard/DeadlineAlertsWidget.php +++ b/lib/Dashboard/DeadlineAlertsWidget.php @@ -9,7 +9,7 @@ * @category Dashboard * @package OCA\Procest\Dashboard * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Dashboard/MyTasksWidget.php b/lib/Dashboard/MyTasksWidget.php index cc345954..32970788 100644 --- a/lib/Dashboard/MyTasksWidget.php +++ b/lib/Dashboard/MyTasksWidget.php @@ -8,7 +8,7 @@ * @category Dashboard * @package OCA\Procest\Dashboard * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Dashboard/OverdueCasesWidget.php b/lib/Dashboard/OverdueCasesWidget.php index 737a353b..b38c7f43 100644 --- a/lib/Dashboard/OverdueCasesWidget.php +++ b/lib/Dashboard/OverdueCasesWidget.php @@ -8,7 +8,7 @@ * @category Dashboard * @package OCA\Procest\Dashboard * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Dashboard/StalledCasesWidget.php b/lib/Dashboard/StalledCasesWidget.php index 059622fe..4c17a8dd 100644 --- a/lib/Dashboard/StalledCasesWidget.php +++ b/lib/Dashboard/StalledCasesWidget.php @@ -9,7 +9,7 @@ * @category Dashboard * @package OCA\Procest\Dashboard * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Dashboard/StartCaseWidget.php b/lib/Dashboard/StartCaseWidget.php index 21a227a8..e24b5136 100644 --- a/lib/Dashboard/StartCaseWidget.php +++ b/lib/Dashboard/StartCaseWidget.php @@ -8,7 +8,7 @@ * @category Dashboard * @package OCA\Procest\Dashboard * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Dashboard/TaskRemindersWidget.php b/lib/Dashboard/TaskRemindersWidget.php index 859f85ae..74442ff6 100644 --- a/lib/Dashboard/TaskRemindersWidget.php +++ b/lib/Dashboard/TaskRemindersWidget.php @@ -9,7 +9,7 @@ * @category Dashboard * @package OCA\Procest\Dashboard * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Listener/DeepLinkRegistrationListener.php b/lib/Listener/DeepLinkRegistrationListener.php index 2d9f3b72..3ec932c8 100644 --- a/lib/Listener/DeepLinkRegistrationListener.php +++ b/lib/Listener/DeepLinkRegistrationListener.php @@ -8,7 +8,7 @@ * @category Listener * @package OCA\Procest\Listener * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Middleware/TenantMiddleware.php b/lib/Middleware/TenantMiddleware.php index b53109e9..d1af9da6 100644 --- a/lib/Middleware/TenantMiddleware.php +++ b/lib/Middleware/TenantMiddleware.php @@ -8,7 +8,7 @@ * @category Middleware * @package OCA\Procest\Middleware * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Middleware/ZgwAuthException.php b/lib/Middleware/ZgwAuthException.php index 21fb4931..fa3e5bdf 100644 --- a/lib/Middleware/ZgwAuthException.php +++ b/lib/Middleware/ZgwAuthException.php @@ -8,7 +8,7 @@ * @category Middleware * @package OCA\Procest\Middleware * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Middleware/ZgwAuthMiddleware.php b/lib/Middleware/ZgwAuthMiddleware.php index c7686183..d10c3919 100644 --- a/lib/Middleware/ZgwAuthMiddleware.php +++ b/lib/Middleware/ZgwAuthMiddleware.php @@ -8,7 +8,7 @@ * @category Middleware * @package OCA\Procest\Middleware * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Repair/InitializeSettings.php b/lib/Repair/InitializeSettings.php index f416bec6..b8a9c9c8 100644 --- a/lib/Repair/InitializeSettings.php +++ b/lib/Repair/InitializeSettings.php @@ -8,7 +8,7 @@ * @category Repair * @package OCA\Procest\Repair * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Repair/LoadDefaultZgwMappings.php b/lib/Repair/LoadDefaultZgwMappings.php index 1cb0ab56..599b56af 100644 --- a/lib/Repair/LoadDefaultZgwMappings.php +++ b/lib/Repair/LoadDefaultZgwMappings.php @@ -10,7 +10,7 @@ * @category Repair * @package OCA\Procest\Repair * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Repair/SeedBezwaarBeroepData.php b/lib/Repair/SeedBezwaarBeroepData.php index c0a2b819..ba11c174 100644 --- a/lib/Repair/SeedBezwaarBeroepData.php +++ b/lib/Repair/SeedBezwaarBeroepData.php @@ -9,7 +9,7 @@ * @category Repair * @package OCA\Procest\Repair * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Sections/SettingsSection.php b/lib/Sections/SettingsSection.php index 23c00f6e..bb5d3ebd 100644 --- a/lib/Sections/SettingsSection.php +++ b/lib/Sections/SettingsSection.php @@ -8,7 +8,7 @@ * @category Sections * @package OCA\Procest\Sections * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/AiService.php b/lib/Service/AiService.php index f1be0299..db068a64 100644 --- a/lib/Service/AiService.php +++ b/lib/Service/AiService.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/CaseDefinitionExportService.php b/lib/Service/CaseDefinitionExportService.php index 22ca3f67..b5b30b9d 100644 --- a/lib/Service/CaseDefinitionExportService.php +++ b/lib/Service/CaseDefinitionExportService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/CaseDefinitionImportService.php b/lib/Service/CaseDefinitionImportService.php index 3a7c13aa..439a0454 100644 --- a/lib/Service/CaseDefinitionImportService.php +++ b/lib/Service/CaseDefinitionImportService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/CaseEmailService.php b/lib/Service/CaseEmailService.php index 0b41a863..62f553bb 100644 --- a/lib/Service/CaseEmailService.php +++ b/lib/Service/CaseEmailService.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/CaseSharingService.php b/lib/Service/CaseSharingService.php index 7db843a6..9fa11266 100644 --- a/lib/Service/CaseSharingService.php +++ b/lib/Service/CaseSharingService.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/CaseTransferService.php b/lib/Service/CaseTransferService.php index f8b1bcf5..3fc3b1af 100644 --- a/lib/Service/CaseTransferService.php +++ b/lib/Service/CaseTransferService.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ChecklistService.php b/lib/Service/ChecklistService.php index 424f0661..9e68e261 100644 --- a/lib/Service/ChecklistService.php +++ b/lib/Service/ChecklistService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ConsultationService.php b/lib/Service/ConsultationService.php index f1d362fa..74d8aab2 100644 --- a/lib/Service/ConsultationService.php +++ b/lib/Service/ConsultationService.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/DsoIntakeService.php b/lib/Service/DsoIntakeService.php index 11d1b11e..d516cc2a 100644 --- a/lib/Service/DsoIntakeService.php +++ b/lib/Service/DsoIntakeService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/GisProxyService.php b/lib/Service/GisProxyService.php index 74b11c9b..c291cbda 100644 --- a/lib/Service/GisProxyService.php +++ b/lib/Service/GisProxyService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/InspectionService.php b/lib/Service/InspectionService.php index c6978469..42bb185d 100644 --- a/lib/Service/InspectionService.php +++ b/lib/Service/InspectionService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/LegesCalculationService.php b/lib/Service/LegesCalculationService.php index 12f1e1b8..9bf53d79 100644 --- a/lib/Service/LegesCalculationService.php +++ b/lib/Service/LegesCalculationService.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/LegesExportService.php b/lib/Service/LegesExportService.php index 6c6a3785..17890f13 100644 --- a/lib/Service/LegesExportService.php +++ b/lib/Service/LegesExportService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/MilestoneService.php b/lib/Service/MilestoneService.php index b334502d..abde2720 100644 --- a/lib/Service/MilestoneService.php +++ b/lib/Service/MilestoneService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/NotificatieService.php b/lib/Service/NotificatieService.php index f3d0c599..8a09fdc6 100644 --- a/lib/Service/NotificatieService.php +++ b/lib/Service/NotificatieService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ParaferingNotificationService.php b/lib/Service/ParaferingNotificationService.php index 28c50484..f501e956 100644 --- a/lib/Service/ParaferingNotificationService.php +++ b/lib/Service/ParaferingNotificationService.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ParaferingService.php b/lib/Service/ParaferingService.php index abd225f8..8a4d2dd8 100644 --- a/lib/Service/ParaferingService.php +++ b/lib/Service/ParaferingService.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/SeedDataService.php b/lib/Service/SeedDataService.php index ebb43879..a603d594 100644 --- a/lib/Service/SeedDataService.php +++ b/lib/Service/SeedDataService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php index 629219b6..a5d7a699 100644 --- a/lib/Service/SettingsService.php +++ b/lib/Service/SettingsService.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/StufFieldMappingService.php b/lib/Service/StufFieldMappingService.php index f13a6d6a..a4650e28 100644 --- a/lib/Service/StufFieldMappingService.php +++ b/lib/Service/StufFieldMappingService.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/StufMessageBuilder.php b/lib/Service/StufMessageBuilder.php index fb68a8f3..7bd388fe 100644 --- a/lib/Service/StufMessageBuilder.php +++ b/lib/Service/StufMessageBuilder.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/TemplateLibraryService.php b/lib/Service/TemplateLibraryService.php index 5fb218eb..790d994c 100644 --- a/lib/Service/TemplateLibraryService.php +++ b/lib/Service/TemplateLibraryService.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/TenantService.php b/lib/Service/TenantService.php index 3a957042..fae5c263 100644 --- a/lib/Service/TenantService.php +++ b/lib/Service/TenantService.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwBrcRulesService.php b/lib/Service/ZgwBrcRulesService.php index 51816245..769222cf 100644 --- a/lib/Service/ZgwBrcRulesService.php +++ b/lib/Service/ZgwBrcRulesService.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwBusinessRulesService.php b/lib/Service/ZgwBusinessRulesService.php index 3efcb63a..77473c47 100644 --- a/lib/Service/ZgwBusinessRulesService.php +++ b/lib/Service/ZgwBusinessRulesService.php @@ -15,7 +15,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwDocumentService.php b/lib/Service/ZgwDocumentService.php index 5db0127f..b421d75f 100644 --- a/lib/Service/ZgwDocumentService.php +++ b/lib/Service/ZgwDocumentService.php @@ -9,7 +9,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwDrcRulesService.php b/lib/Service/ZgwDrcRulesService.php index ea4f2269..673bbbdf 100644 --- a/lib/Service/ZgwDrcRulesService.php +++ b/lib/Service/ZgwDrcRulesService.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwMappingService.php b/lib/Service/ZgwMappingService.php index b04ae9e6..756ec854 100644 --- a/lib/Service/ZgwMappingService.php +++ b/lib/Service/ZgwMappingService.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwPaginationHelper.php b/lib/Service/ZgwPaginationHelper.php index 53105303..cf0f430d 100644 --- a/lib/Service/ZgwPaginationHelper.php +++ b/lib/Service/ZgwPaginationHelper.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwRulesBase.php b/lib/Service/ZgwRulesBase.php index b5001e45..9bbda8e9 100644 --- a/lib/Service/ZgwRulesBase.php +++ b/lib/Service/ZgwRulesBase.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwService.php b/lib/Service/ZgwService.php index 1292ab49..8cf16f19 100644 --- a/lib/Service/ZgwService.php +++ b/lib/Service/ZgwService.php @@ -10,7 +10,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwZrcRulesService.php b/lib/Service/ZgwZrcRulesService.php index 52575e9e..78ddfc4d 100644 --- a/lib/Service/ZgwZrcRulesService.php +++ b/lib/Service/ZgwZrcRulesService.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Service/ZgwZtcRulesService.php b/lib/Service/ZgwZtcRulesService.php index 14b3f6b2..7bfd40d3 100644 --- a/lib/Service/ZgwZtcRulesService.php +++ b/lib/Service/ZgwZtcRulesService.php @@ -8,7 +8,7 @@ * @category Service * @package OCA\Procest\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/lib/Settings/AdminSettings.php b/lib/Settings/AdminSettings.php index 2fb70802..d4b70b06 100644 --- a/lib/Settings/AdminSettings.php +++ b/lib/Settings/AdminSettings.php @@ -8,7 +8,7 @@ * @category Settings * @package OCA\Procest\Settings * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Controller/GisProxyControllerTest.php b/tests/Unit/Controller/GisProxyControllerTest.php index 2e2b0e34..ae029c4f 100644 --- a/tests/Unit/Controller/GisProxyControllerTest.php +++ b/tests/Unit/Controller/GisProxyControllerTest.php @@ -9,7 +9,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Controller/HealthControllerTest.php b/tests/Unit/Controller/HealthControllerTest.php index 439180f4..d14025a0 100644 --- a/tests/Unit/Controller/HealthControllerTest.php +++ b/tests/Unit/Controller/HealthControllerTest.php @@ -8,7 +8,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Controller/MetricsControllerTest.php b/tests/Unit/Controller/MetricsControllerTest.php index 4aeee5a0..8ae1dc05 100644 --- a/tests/Unit/Controller/MetricsControllerTest.php +++ b/tests/Unit/Controller/MetricsControllerTest.php @@ -8,7 +8,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Controller * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Dashboard/SignaleringWidgetsTest.php b/tests/Unit/Dashboard/SignaleringWidgetsTest.php index 723d462a..3a6b0c23 100644 --- a/tests/Unit/Dashboard/SignaleringWidgetsTest.php +++ b/tests/Unit/Dashboard/SignaleringWidgetsTest.php @@ -8,7 +8,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Dashboard * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Middleware/ZgwAuthMiddlewareTest.php b/tests/Unit/Middleware/ZgwAuthMiddlewareTest.php index 1f748cc7..5c6fa0ab 100644 --- a/tests/Unit/Middleware/ZgwAuthMiddlewareTest.php +++ b/tests/Unit/Middleware/ZgwAuthMiddlewareTest.php @@ -8,7 +8,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Middleware * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Repair/SeedBezwaarBeroepDataTest.php b/tests/Unit/Repair/SeedBezwaarBeroepDataTest.php index b4e97dd8..60ebaf27 100644 --- a/tests/Unit/Repair/SeedBezwaarBeroepDataTest.php +++ b/tests/Unit/Repair/SeedBezwaarBeroepDataTest.php @@ -9,7 +9,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Repair * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Service/GisProxyServiceTest.php b/tests/Unit/Service/GisProxyServiceTest.php index ce2e9b4f..03937506 100644 --- a/tests/Unit/Service/GisProxyServiceTest.php +++ b/tests/Unit/Service/GisProxyServiceTest.php @@ -9,7 +9,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Service/ParaferingNotificationServiceTest.php b/tests/Unit/Service/ParaferingNotificationServiceTest.php index d2b4c017..098cec32 100644 --- a/tests/Unit/Service/ParaferingNotificationServiceTest.php +++ b/tests/Unit/Service/ParaferingNotificationServiceTest.php @@ -9,7 +9,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Service/SeedDataServiceTest.php b/tests/Unit/Service/SeedDataServiceTest.php index 7d3da4b5..fb9764fb 100644 --- a/tests/Unit/Service/SeedDataServiceTest.php +++ b/tests/Unit/Service/SeedDataServiceTest.php @@ -9,7 +9,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Service/SettingsServiceTest.php b/tests/Unit/Service/SettingsServiceTest.php index e7a6a5f0..fda3d0a4 100644 --- a/tests/Unit/Service/SettingsServiceTest.php +++ b/tests/Unit/Service/SettingsServiceTest.php @@ -8,7 +8,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Service/VthSettingsServiceTest.php b/tests/Unit/Service/VthSettingsServiceTest.php index 78cd6cff..a2b9e511 100644 --- a/tests/Unit/Service/VthSettingsServiceTest.php +++ b/tests/Unit/Service/VthSettingsServiceTest.php @@ -10,7 +10,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Service/ZgwMappingServiceTest.php b/tests/Unit/Service/ZgwMappingServiceTest.php index 84206c2a..95f4fd78 100644 --- a/tests/Unit/Service/ZgwMappingServiceTest.php +++ b/tests/Unit/Service/ZgwMappingServiceTest.php @@ -8,7 +8,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Service/ZgwPaginationHelperTest.php b/tests/Unit/Service/ZgwPaginationHelperTest.php index 988dc302..c24979d5 100644 --- a/tests/Unit/Service/ZgwPaginationHelperTest.php +++ b/tests/Unit/Service/ZgwPaginationHelperTest.php @@ -8,7 +8,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Service/ZgwZrcRulesServiceTest.php b/tests/Unit/Service/ZgwZrcRulesServiceTest.php index 7e20eed1..27e24758 100644 --- a/tests/Unit/Service/ZgwZrcRulesServiceTest.php +++ b/tests/Unit/Service/ZgwZrcRulesServiceTest.php @@ -8,7 +8,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Service * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Settings/VthSchemaTest.php b/tests/Unit/Settings/VthSchemaTest.php index 19e4d960..c9684c1e 100644 --- a/tests/Unit/Settings/VthSchemaTest.php +++ b/tests/Unit/Settings/VthSchemaTest.php @@ -10,7 +10,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Settings * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/Unit/Settings/WorkflowEngineSchemaTest.php b/tests/Unit/Settings/WorkflowEngineSchemaTest.php index 1a85bd47..a7bc221f 100644 --- a/tests/Unit/Settings/WorkflowEngineSchemaTest.php +++ b/tests/Unit/Settings/WorkflowEngineSchemaTest.php @@ -9,7 +9,7 @@ * @category Tests * @package OCA\Procest\Tests\Unit\Settings * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 4bd9763f..79e56f1c 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -8,7 +8,7 @@ * @category Tests * @package OCA\Procest\Tests * - * @author Conduction Development Team + * @author Conduction Development Team * @copyright 2024 Conduction B.V. * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 * From 29a49f3af99847cd776ab7b8281e8b61f348554a Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 20 Apr 2026 11:14:52 +0200 Subject: [PATCH 3/6] chore(retrofit): add opsx coverage scan reports for procest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds two coverage reports produced by /opsx-coverage-scan: - coverage-report.pilot.{md,json} — 2026-04-20 file-level pilot run (PHP only, 89 files, ~180 Bucket 1 candidates estimated) - coverage-report.{md,json} — 2026-04-20 full per-method pass (PHP + Vue/TS, 764 PHP methods + 318 frontend units classified; 678 Bucket 1, 96 Bucket 2a / 7 clusters, 206 Bucket 2b / 9 clusters, 73 Bucket 3b, 115 Bucket 4 findings across 3 ADR rules) Read-only — no code changes. Feeds the /opsx-annotate and /opsx-reverse-spec retrofit commands. --- openspec/coverage-report.json | 11550 ++++++++++++++++++++++++++ openspec/coverage-report.md | 1224 +++ openspec/coverage-report.pilot.json | 197 + openspec/coverage-report.pilot.md | 260 + 4 files changed, 13231 insertions(+) create mode 100644 openspec/coverage-report.json create mode 100644 openspec/coverage-report.md create mode 100644 openspec/coverage-report.pilot.json create mode 100644 openspec/coverage-report.pilot.md diff --git a/openspec/coverage-report.json b/openspec/coverage-report.json new file mode 100644 index 00000000..c972d102 --- /dev/null +++ b/openspec/coverage-report.json @@ -0,0 +1,11550 @@ +{ + "generated_at": "2026-04-20T08:44:01Z", + "app": "procest", + "branch": "fix/header-info-email-phpcs", + "scanner_version": "1", + "scope": { + "php_files_scanned": 89, + "frontend_files_scanned": 183, + "php_methods_classified": 764, + "frontend_units_classified": 318, + "total_reqs": 331 + }, + "buckets": { + "annotated": [], + "plumbing": [ + { + "file": "lib/AppInfo/Application.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/BackgroundJob/AppointmentReminderJob.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/BackgroundJob/BerichtenboxReadStatusJob.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/BackgroundJob/ShareMaintenanceJob.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/AiController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/AppointmentController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/BerichtenboxController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/CaseDefinitionController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/CaseSharingController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/ConsultationController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/DashboardController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/EmailController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/GisProxyController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/LegesController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/PublicAppointmentController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/PublicShareController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/SettingsController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/StufController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/TemplateController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Controller/TenantController.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Dashboard/CasesOverviewWidget.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Dashboard/CasesOverviewWidget.php", + "method": "getId", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/CasesOverviewWidget.php", + "method": "getTitle", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/CasesOverviewWidget.php", + "method": "getOrder", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/CasesOverviewWidget.php", + "method": "getIconClass", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/CasesOverviewWidget.php", + "method": "getUrl", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/CasesOverviewWidget.php", + "method": "load", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/DeadlineAlertsWidget.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Dashboard/DeadlineAlertsWidget.php", + "method": "getId", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/DeadlineAlertsWidget.php", + "method": "getTitle", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/DeadlineAlertsWidget.php", + "method": "getOrder", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/DeadlineAlertsWidget.php", + "method": "getIconClass", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/DeadlineAlertsWidget.php", + "method": "getUrl", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/DeadlineAlertsWidget.php", + "method": "load", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/MyTasksWidget.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Dashboard/MyTasksWidget.php", + "method": "getId", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/MyTasksWidget.php", + "method": "getTitle", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/MyTasksWidget.php", + "method": "getOrder", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/MyTasksWidget.php", + "method": "getIconClass", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/MyTasksWidget.php", + "method": "getUrl", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/MyTasksWidget.php", + "method": "load", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/OverdueCasesWidget.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Dashboard/OverdueCasesWidget.php", + "method": "getId", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/OverdueCasesWidget.php", + "method": "getTitle", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/OverdueCasesWidget.php", + "method": "getOrder", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/OverdueCasesWidget.php", + "method": "getIconClass", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/OverdueCasesWidget.php", + "method": "getUrl", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/OverdueCasesWidget.php", + "method": "load", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StalledCasesWidget.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Dashboard/StalledCasesWidget.php", + "method": "getId", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StalledCasesWidget.php", + "method": "getTitle", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StalledCasesWidget.php", + "method": "getOrder", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StalledCasesWidget.php", + "method": "getIconClass", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StalledCasesWidget.php", + "method": "getUrl", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StalledCasesWidget.php", + "method": "load", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StartCaseWidget.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Dashboard/StartCaseWidget.php", + "method": "getId", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StartCaseWidget.php", + "method": "getTitle", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StartCaseWidget.php", + "method": "getOrder", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StartCaseWidget.php", + "method": "getIconClass", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StartCaseWidget.php", + "method": "getUrl", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/StartCaseWidget.php", + "method": "load", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/TaskRemindersWidget.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Dashboard/TaskRemindersWidget.php", + "method": "getId", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/TaskRemindersWidget.php", + "method": "getTitle", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/TaskRemindersWidget.php", + "method": "getOrder", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/TaskRemindersWidget.php", + "method": "getIconClass", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/TaskRemindersWidget.php", + "method": "getUrl", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Dashboard/TaskRemindersWidget.php", + "method": "load", + "reason": "dashboard-widget-boilerplate" + }, + { + "file": "lib/Listener/DeepLinkRegistrationListener.php", + "method": "handle", + "reason": "listener-single-dispatch" + }, + { + "file": "lib/Middleware/TenantMiddleware.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Middleware/ZgwAuthException.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/AiService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/AppointmentBackend/AppointmentBackendInterface.php", + "method": "getTimeslots", + "reason": "interface-or-trait" + }, + { + "file": "lib/Service/AppointmentBackend/AppointmentBackendInterface.php", + "method": "bookAppointment", + "reason": "interface-or-trait" + }, + { + "file": "lib/Service/AppointmentBackend/AppointmentBackendInterface.php", + "method": "cancelAppointment", + "reason": "interface-or-trait" + }, + { + "file": "lib/Service/AppointmentBackend/AppointmentBackendInterface.php", + "method": "rescheduleAppointment", + "reason": "interface-or-trait" + }, + { + "file": "lib/Service/AppointmentBackend/JccBackend.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/AppointmentBackend/LocalBackend.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/AppointmentBackend/QmaticBackend.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/AppointmentService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php", + "method": "sendMessage", + "reason": "interface-or-trait" + }, + { + "file": "lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php", + "method": "getReadStatus", + "reason": "interface-or-trait" + }, + { + "file": "lib/Service/BerichtenboxAdapter/MockAdapter.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/BerichtenboxService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/CaseDefinitionExportService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/CaseDefinitionImportService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/CaseTransferService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/ConsultationService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/DsoIntakeService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/GisProxyService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/LegesExportService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/NotificatieService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/SettingsService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/StufMessageBuilder.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/TemplateLibraryService.php", + "method": "__construct", + "reason": "magic-method" + }, + { + "file": "lib/Service/TenantService.php", + "method": "__construct", + "reason": "magic-method" + } + ], + "bucket_1": [ + { + "file": "lib/AppInfo/Application.php", + "method": "register", + "class": "Application", + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-001", + "req_title": "1: App MUST be a valid Nextcloud app with proper metadata", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: Application::register = NC app registration boot (REQ-001)", + "inherits_from": null + }, + { + "file": "lib/AppInfo/Application.php", + "method": "boot", + "class": "Application", + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-001", + "req_title": "1: App MUST be a valid Nextcloud app with proper metadata", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: Application::boot = NC app boot hook", + "inherits_from": null + }, + { + "file": "lib/Controller/AcController.php", + "method": "__construct", + "class": "AcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: AcController=AC API", + "inherits_from": null + }, + { + "file": "lib/Controller/AcController.php", + "method": "index", + "class": "AcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: AcController=AC API", + "inherits_from": null + }, + { + "file": "lib/Controller/AcController.php", + "method": "create", + "class": "AcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: AcController=AC API", + "inherits_from": null + }, + { + "file": "lib/Controller/AcController.php", + "method": "show", + "class": "AcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: AcController=AC API", + "inherits_from": null + }, + { + "file": "lib/Controller/AcController.php", + "method": "update", + "class": "AcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: AcController=AC API", + "inherits_from": null + }, + { + "file": "lib/Controller/AcController.php", + "method": "patch", + "class": "AcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: AcController=AC API", + "inherits_from": null + }, + { + "file": "lib/Controller/AcController.php", + "method": "destroy", + "class": "AcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: AcController=AC API", + "inherits_from": null + }, + { + "file": "lib/Controller/BrcController.php", + "method": "__construct", + "class": "BrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: BrcController=BRC API, REQ-006 covers BRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/BrcController.php", + "method": "index", + "class": "BrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: BrcController=BRC API, REQ-006 covers BRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/BrcController.php", + "method": "create", + "class": "BrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: BrcController=BRC API, REQ-006 covers BRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/BrcController.php", + "method": "show", + "class": "BrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: BrcController=BRC API, REQ-006 covers BRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/BrcController.php", + "method": "update", + "class": "BrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: BrcController=BRC API, REQ-006 covers BRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/BrcController.php", + "method": "patch", + "class": "BrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: BrcController=BRC API, REQ-006 covers BRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/BrcController.php", + "method": "destroy", + "class": "BrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: BrcController=BRC API, REQ-006 covers BRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/BrcController.php", + "method": "audittrailIndex", + "class": "BrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: BrcController=BRC API, REQ-006 covers BRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/BrcController.php", + "method": "audittrailShow", + "class": "BrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: BrcController=BRC API, REQ-006 covers BRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DashboardController.php", + "method": "page", + "class": "DashboardController", + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-002", + "req_title": "2: App MUST provide a single-page application entry point", + "confidence": 0.93, + "needs_review": false, + "signal": "explicit: Vue SPA entry point (REQ-002)", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "__construct", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "index", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "create", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "show", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "update", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "patch", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "destroy", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "download", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "lock", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "unlock", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "audittrailIndex", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "audittrailShow", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/DrcController.php", + "method": "uploadChunk", + "class": "DrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: DrcController=DRC API, REQ-005 covers DRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/GisProxyController.php", + "method": "proxy", + "class": "GisProxyController", + "visibility": "public", + "capability": "wms-wfs-layers", + "req_id": "REQ-LAYER-03", + "req_title": "GIS Proxy Endpoint", + "confidence": 0.93, + "needs_review": false, + "signal": "name+path keyword match", + "inherits_from": null + }, + { + "file": "lib/Controller/HealthController.php", + "method": "__construct", + "class": "HealthController", + "visibility": "public", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-004", + "req_title": "Health Check Endpoint", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Health endpoint helpers", + "inherits_from": null + }, + { + "file": "lib/Controller/HealthController.php", + "method": "index", + "class": "HealthController", + "visibility": "public", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-004", + "req_title": "Health Check Endpoint", + "confidence": 0.97, + "needs_review": false, + "signal": "explicit: /health endpoint", + "inherits_from": null + }, + { + "file": "lib/Controller/InspectionController.php", + "method": "__construct", + "class": "InspectionController", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection controller methods", + "inherits_from": null + }, + { + "file": "lib/Controller/InspectionController.php", + "method": "index", + "class": "InspectionController", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection controller methods", + "inherits_from": null + }, + { + "file": "lib/Controller/InspectionController.php", + "method": "captureLocation", + "class": "InspectionController", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection controller methods", + "inherits_from": null + }, + { + "file": "lib/Controller/InspectionController.php", + "method": "completeChecklistItem", + "class": "InspectionController", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection controller methods", + "inherits_from": null + }, + { + "file": "lib/Controller/InspectionController.php", + "method": "addPhoto", + "class": "InspectionController", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection controller methods", + "inherits_from": null + }, + { + "file": "lib/Controller/InspectionController.php", + "method": "complete", + "class": "InspectionController", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection controller methods", + "inherits_from": null + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "__construct", + "class": "MetricsController", + "visibility": "public", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Metrics endpoint helpers \u2014 private fall back here via Pass B", + "inherits_from": null + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "index", + "class": "MetricsController", + "visibility": "public", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.97, + "needs_review": false, + "signal": "explicit: /metrics endpoint", + "inherits_from": null + }, + { + "file": "lib/Controller/MilestoneController.php", + "method": "__construct", + "class": "MilestoneController", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestone endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/MilestoneController.php", + "method": "progress", + "class": "MilestoneController", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestone endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/MilestoneController.php", + "method": "mark", + "class": "MilestoneController", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestone endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/MilestoneController.php", + "method": "reverse", + "class": "MilestoneController", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestone endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "__construct", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "index", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "create", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "show", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "update", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "patch", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "destroy", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "notificatieCreate", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "audittrailIndex", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/NrcController.php", + "method": "audittrailShow", + "class": "NrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-008", + "req_title": "Bidirectional mapping MUST support both inbound and outbound transformations", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: NrcController=NRC API", + "inherits_from": null + }, + { + "file": "lib/Controller/ParaferingController.php", + "method": "__construct", + "class": "ParaferingController", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering controller", + "inherits_from": null + }, + { + "file": "lib/Controller/ParaferingController.php", + "method": "createVoorstel", + "class": "ParaferingController", + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-002", + "req_title": "Create Voorstel from Case", + "confidence": 0.9, + "needs_review": false, + "signal": "explicit: Create voorstel from case", + "inherits_from": null + }, + { + "file": "lib/Controller/ParaferingController.php", + "method": "startParafering", + "class": "ParaferingController", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Parafering route start", + "inherits_from": null + }, + { + "file": "lib/Controller/ParaferingController.php", + "method": "paraferen", + "class": "ParaferingController", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering controller", + "inherits_from": null + }, + { + "file": "lib/Controller/ParaferingController.php", + "method": "terugsturen", + "class": "ParaferingController", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering controller", + "inherits_from": null + }, + { + "file": "lib/Controller/ParaferingController.php", + "method": "adviseren", + "class": "ParaferingController", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering controller", + "inherits_from": null + }, + { + "file": "lib/Controller/ParaferingController.php", + "method": "auditTrail", + "class": "ParaferingController", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering controller", + "inherits_from": null + }, + { + "file": "lib/Controller/ZgwMappingController.php", + "method": "__construct", + "class": "ZgwMappingController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: ZGW mapping admin endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/ZgwMappingController.php", + "method": "index", + "class": "ZgwMappingController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: ZGW mapping admin endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/ZgwMappingController.php", + "method": "show", + "class": "ZgwMappingController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: ZGW mapping admin endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/ZgwMappingController.php", + "method": "update", + "class": "ZgwMappingController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: ZGW mapping admin endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/ZgwMappingController.php", + "method": "destroy", + "class": "ZgwMappingController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: ZGW mapping admin endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/ZgwMappingController.php", + "method": "reset", + "class": "ZgwMappingController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: ZGW mapping admin endpoints", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "__construct", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "index", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "create", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "show", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "update", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "patch", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "destroy", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "zaakeigenschappenIndex", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "zaakeigenschappenCreate", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "zaakeigenschappenShow", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "zaakeigenschappenUpdate", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "zaakeigenschappenPatch", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "zaakeigenschappenDestroy", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "zaakbesluitenIndex", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "zoek", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "audittrailIndex", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "audittrailShow", + "class": "ZrcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "__construct", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "index", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "create", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "show", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "update", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "patch", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "destroy", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "publishZaaktype", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "publishBesluittype", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "publishInformatieobjecttype", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "audittrailIndex", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "audittrailShow", + "class": "ZtcController", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability", + "inherits_from": null + }, + { + "file": "lib/Repair/InitializeSettings.php", + "method": "__construct", + "class": "InitializeSettings", + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-006", + "req_title": "6: App MUST provide admin settings page", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: Settings initialization on install", + "inherits_from": null + }, + { + "file": "lib/Repair/InitializeSettings.php", + "method": "getName", + "class": "InitializeSettings", + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-006", + "req_title": "6: App MUST provide admin settings page", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: Settings initialization on install", + "inherits_from": null + }, + { + "file": "lib/Repair/InitializeSettings.php", + "method": "run", + "class": "InitializeSettings", + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-006", + "req_title": "6: App MUST provide admin settings page", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: Settings initialization on install", + "inherits_from": null + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "__construct", + "class": "LoadDefaultZgwMappings", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.9, + "needs_review": false, + "signal": "explicit: Seeds default ZGW mappings on install", + "inherits_from": null + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getName", + "class": "LoadDefaultZgwMappings", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.9, + "needs_review": false, + "signal": "explicit: Seeds default ZGW mappings on install", + "inherits_from": null + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "run", + "class": "LoadDefaultZgwMappings", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.9, + "needs_review": false, + "signal": "explicit: Seeds default ZGW mappings on install", + "inherits_from": null + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getDefaultMappings", + "class": "LoadDefaultZgwMappings", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.9, + "needs_review": false, + "signal": "explicit: Seeds default ZGW mappings on install", + "inherits_from": null + }, + { + "file": "lib/Repair/SeedBezwaarBeroepData.php", + "method": "__construct", + "class": "SeedBezwaarBeroepData", + "visibility": "public", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: Seed repair step", + "inherits_from": null + }, + { + "file": "lib/Repair/SeedBezwaarBeroepData.php", + "method": "getName", + "class": "SeedBezwaarBeroepData", + "visibility": "public", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: Seed repair step", + "inherits_from": null + }, + { + "file": "lib/Repair/SeedBezwaarBeroepData.php", + "method": "run", + "class": "SeedBezwaarBeroepData", + "visibility": "public", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.92, + "needs_review": false, + "signal": "explicit: Seed repair step", + "inherits_from": null + }, + { + "file": "lib/Sections/SettingsSection.php", + "method": "__construct", + "class": "SettingsSection", + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: IIconSection implementation", + "inherits_from": null + }, + { + "file": "lib/Sections/SettingsSection.php", + "method": "getID", + "class": "SettingsSection", + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: IIconSection implementation", + "inherits_from": null + }, + { + "file": "lib/Sections/SettingsSection.php", + "method": "getName", + "class": "SettingsSection", + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: IIconSection implementation", + "inherits_from": null + }, + { + "file": "lib/Sections/SettingsSection.php", + "method": "getPriority", + "class": "SettingsSection", + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: IIconSection implementation", + "inherits_from": null + }, + { + "file": "lib/Sections/SettingsSection.php", + "method": "getIcon", + "class": "SettingsSection", + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: IIconSection implementation", + "inherits_from": null + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "extractCaseNumber", + "class": "CaseEmailService", + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.75, + "needs_review": true, + "signal": "name+path keyword match", + "inherits_from": null + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "getTemplatesForCaseType", + "class": "CaseEmailService", + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.75, + "needs_review": true, + "signal": "name+path keyword match", + "inherits_from": null + }, + { + "file": "lib/Service/ChecklistService.php", + "method": "__construct", + "class": "ChecklistService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: Checklist validation and progress", + "inherits_from": null + }, + { + "file": "lib/Service/ChecklistService.php", + "method": "completeItem", + "class": "ChecklistService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: Checklist validation and progress", + "inherits_from": null + }, + { + "file": "lib/Service/ChecklistService.php", + "method": "getProgress", + "class": "ChecklistService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: Checklist validation and progress", + "inherits_from": null + }, + { + "file": "lib/Service/ChecklistService.php", + "method": "validateCompletion", + "class": "ChecklistService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: Checklist validation and progress", + "inherits_from": null + }, + { + "file": "lib/Service/ChecklistService.php", + "method": "getConformitySummary", + "class": "ChecklistService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: Checklist validation and progress", + "inherits_from": null + }, + { + "file": "lib/Service/GisProxyService.php", + "method": "proxyRequest", + "class": "GisProxyService", + "visibility": "public", + "capability": "wms-wfs-layers", + "req_id": "REQ-LAYER-03", + "req_title": "GIS Proxy Endpoint", + "confidence": 0.93, + "needs_review": false, + "signal": "name+path keyword match", + "inherits_from": null + }, + { + "file": "lib/Service/InspectionService.php", + "method": "__construct", + "class": "InspectionService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-003", + "req_title": "Inspection rapport creation", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection service methods", + "inherits_from": null + }, + { + "file": "lib/Service/InspectionService.php", + "method": "getInspections", + "class": "InspectionService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-003", + "req_title": "Inspection rapport creation", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection service methods", + "inherits_from": null + }, + { + "file": "lib/Service/InspectionService.php", + "method": "captureLocation", + "class": "InspectionService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-003", + "req_title": "Inspection rapport creation", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection service methods", + "inherits_from": null + }, + { + "file": "lib/Service/InspectionService.php", + "method": "addPhoto", + "class": "InspectionService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-003", + "req_title": "Inspection rapport creation", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection service methods", + "inherits_from": null + }, + { + "file": "lib/Service/InspectionService.php", + "method": "completeInspection", + "class": "InspectionService", + "visibility": "public", + "capability": "inspection-checklists", + "req_id": "REQ-003", + "req_title": "Inspection rapport creation", + "confidence": 0.83, + "needs_review": true, + "signal": "explicit: Inspection service methods", + "inherits_from": null + }, + { + "file": "lib/Service/MilestoneService.php", + "method": "__construct", + "class": "MilestoneService", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestones = doorloop milestones", + "inherits_from": null + }, + { + "file": "lib/Service/MilestoneService.php", + "method": "getMilestones", + "class": "MilestoneService", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestones = doorloop milestones", + "inherits_from": null + }, + { + "file": "lib/Service/MilestoneService.php", + "method": "getCaseProgress", + "class": "MilestoneService", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestones = doorloop milestones", + "inherits_from": null + }, + { + "file": "lib/Service/MilestoneService.php", + "method": "markMilestone", + "class": "MilestoneService", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestones = doorloop milestones", + "inherits_from": null + }, + { + "file": "lib/Service/MilestoneService.php", + "method": "reverseMilestone", + "class": "MilestoneService", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestones = doorloop milestones", + "inherits_from": null + }, + { + "file": "lib/Service/MilestoneService.php", + "method": "getDurationAnalytics", + "class": "MilestoneService", + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.8, + "needs_review": true, + "signal": "explicit: Milestones = doorloop milestones", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingNotificationService.php", + "method": "__construct", + "class": "ParaferingNotificationService", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering notifications \u2014 NEEDS-REVIEW specific REQ", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingNotificationService.php", + "method": "notifyStepActivated", + "class": "ParaferingNotificationService", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering notifications \u2014 NEEDS-REVIEW specific REQ", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingNotificationService.php", + "method": "notifyVoorstelReturned", + "class": "ParaferingNotificationService", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering notifications \u2014 NEEDS-REVIEW specific REQ", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingNotificationService.php", + "method": "notifyParaferingReminder", + "class": "ParaferingNotificationService", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering notifications \u2014 NEEDS-REVIEW specific REQ", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "__construct", + "class": "ParaferingService", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering service \u2014 specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "createVoorstel", + "class": "ParaferingService", + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-002", + "req_title": "Create Voorstel from Case", + "confidence": 0.9, + "needs_review": false, + "signal": "explicit: Create voorstel from case", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "startParafering", + "class": "ParaferingService", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Parafering route start", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "executeAction", + "class": "ParaferingService", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Parafering action execution", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "getAuditTrail", + "class": "ParaferingService", + "visibility": "public", + "capability": "parafering-audit-trail", + "req_id": "REQ-001", + "req_title": "Immutable Parafering Audit Trail", + "confidence": 0.9, + "needs_review": false, + "signal": "explicit: Audit trail query", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "getCurrentStep", + "class": "ParaferingService", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering service \u2014 specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "overrideRoute", + "class": "ParaferingService", + "visibility": "public", + "capability": "parafering-actions", + "req_id": "REQ-002", + "req_title": "Paraferen Action (Approve)", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Parafering service \u2014 specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "__construct", + "class": "SeedDataService", + "visibility": "public", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Seed data service", + "inherits_from": null + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "seedBezwaarBeroepData", + "class": "SeedDataService", + "visibility": "public", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Seed data service", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwBusinessRulesService.php", + "method": "__construct", + "class": "ZgwBusinessRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Business rules dispatcher \u2014 routes to *RulesService", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwBusinessRulesService.php", + "method": "validate", + "class": "ZgwBusinessRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: Business rules dispatcher \u2014 routes to *RulesService", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "__construct", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "storeBase64", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "storeRaw", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "getContent", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "fileExists", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "deleteFiles", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "getMimeType", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "storeChunk", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "getUploadedChunks", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "mergeChunks", + "class": "ZgwDocumentService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW document handling (DRC mappability helpers)", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwMappingService.php", + "method": "__construct", + "class": "ZgwMappingService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Explicit mapping-layer service", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwMappingService.php", + "method": "getMapping", + "class": "ZgwMappingService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Explicit mapping-layer service", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwMappingService.php", + "method": "saveMapping", + "class": "ZgwMappingService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Explicit mapping-layer service", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwMappingService.php", + "method": "listMappings", + "class": "ZgwMappingService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Explicit mapping-layer service", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwMappingService.php", + "method": "deleteMapping", + "class": "ZgwMappingService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Explicit mapping-layer service", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwMappingService.php", + "method": "getResourceKeys", + "class": "ZgwMappingService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Explicit mapping-layer service", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwMappingService.php", + "method": "hasMapping", + "class": "ZgwMappingService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Explicit mapping-layer service", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwMappingService.php", + "method": "resetToDefault", + "class": "ZgwMappingService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Explicit mapping-layer service", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwPaginationHelper.php", + "method": "wrapResults", + "class": "ZgwPaginationHelper", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.82, + "needs_review": true, + "signal": "explicit: ZGW pagination helper \u2014 covers REQ-002 endpoint system", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "__construct", + "class": "ZgwRulesBase", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.75, + "needs_review": true, + "signal": "explicit: Rules base class \u2014 shared helpers inherited by all rules services", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "setContext", + "class": "ZgwRulesBase", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.75, + "needs_review": true, + "signal": "explicit: Rules base class \u2014 shared helpers inherited by all rules services", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "__construct", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "getObjectService", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "getConsumerMapper", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "getZgwMappingService", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "getPaginationHelper", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "getDocumentService", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "getBusinessRulesService", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "getLogger", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "loadMappingConfig", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "translateQueryParams", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "createOutboundMapping", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "createInboundMapping", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "applyOutboundMapping", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "applyInboundMapping", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "getRequestBody", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "resolvePathUuid", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "updateCachedBodyField", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "buildBaseUrl", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "validateJwtAuth", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "consumerHasScope", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "getConsumerAuthorisaties", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "publishNotification", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "buildValidationError", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "unavailableResponse", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "mappingNotFoundResponse", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "handleIndex", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "handleCreate", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "handleShow", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "handleUpdate", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "handleDestroy", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "handleAudittrailIndex", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "handleAudittrailShow", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "resolveZaakClosed", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "resolveZaakClosedFromBody", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "resolveParentZaaktypeDraft", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwService.php", + "method": "resolveParentZaaktypeDraftFromBody", + "class": "ZgwService", + "visibility": "public", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.85, + "needs_review": false, + "signal": "explicit: Central ZGW orchestrator \u2014 REQ-by-REQ mapping deferred to annotate", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesZakenCreate", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesZakenUpdate", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesZakenPatch", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesStatussenCreate", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesResultatenCreate", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesRollenCreate", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesZaakinformatieobjectenCreate", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesZaakinformatieobjectenUpdate", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesZaakinformatieobjectenPatch", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "rulesZaakeigenschappenCreate", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "detectEindstatus", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "filterZakenForConsumer", + "class": "ZgwZrcRulesService", + "visibility": "public", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.78, + "needs_review": true, + "signal": "explicit: ZRC rules service \u2014 specific ZRC-NNN REQ per method requires reading body", + "inherits_from": null + }, + { + "file": "lib/Settings/AdminSettings.php", + "method": "__construct", + "class": "AdminSettings", + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: ISettings implementation for panel registration", + "inherits_from": null + }, + { + "file": "lib/Settings/AdminSettings.php", + "method": "getForm", + "class": "AdminSettings", + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: ISettings implementation for panel registration", + "inherits_from": null + }, + { + "file": "lib/Settings/AdminSettings.php", + "method": "getSection", + "class": "AdminSettings", + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: ISettings implementation for panel registration", + "inherits_from": null + }, + { + "file": "lib/Settings/AdminSettings.php", + "method": "getPriority", + "class": "AdminSettings", + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.95, + "needs_review": false, + "signal": "explicit: ISettings implementation for panel registration", + "inherits_from": null + }, + { + "file": "lib/Controller/AcController.php", + "method": "findConsumerByUuid", + "class": "AcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/AcController.php", + "method": "validateApplicatieBody", + "class": "AcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/AcController.php", + "method": "validateClientIdUniqueness", + "class": "AcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/AcController.php", + "method": "validateAutorisatieConsistency", + "class": "AcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/AcController.php", + "method": "validateAutorisatieScopes", + "class": "AcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/AcController.php", + "method": "scopesContain", + "class": "AcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/AcController.php", + "method": "getConsumerClientIds", + "class": "AcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/AcController.php", + "method": "consumerToApplicatie", + "class": "AcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/AcController.php", + "method": "applicatieToConsumer", + "class": "AcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-007", + "req_title": "NRC (Notificaties API) compatibility MUST be supported", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/BrcController.php", + "method": "createBesluitWithZaakSync", + "class": "BrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/BrcController.php", + "method": "syncZaakBesluitToZrc", + "class": "BrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/BrcController.php", + "method": "indexBesluitInformatieObjecten", + "class": "BrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/BrcController.php", + "method": "createBesluitInformatieObject", + "class": "BrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/BrcController.php", + "method": "createOioInDrc", + "class": "BrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/BrcController.php", + "method": "deleteOiosForBesluit", + "class": "BrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/BrcController.php", + "method": "destroyBesluitInformatieObject", + "class": "BrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/BrcController.php", + "method": "deleteOioByBesluitAndIo", + "class": "BrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/BrcController.php", + "method": "destroyBesluit", + "class": "BrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-006", + "req_title": "BRC (Besluiten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "indexFlatArray", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "lockFallback", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "unlockFallback", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "findOioRelationsForEio", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "searchRelationsInSchema", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "extractIdsFromResults", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "cascadeDeleteGebruiksrechten", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "updateIndicatieGebruiksrecht", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "getGebruiksrechtData", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "checkAndClearIndicatieGebruiksrecht", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "setIndicatieGebruiksrecht", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "enrichWithBestandsdelen", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "parseFileParts", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "buildBestandsdelenArray", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "handleEioUpdate", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "checkDocumentLock", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "resolveStoredLockId", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "storeLockIdInData", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/DrcController.php", + "method": "clearLockIdInData", + "class": "DrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/HealthController.php", + "method": "checkDatabase", + "class": "HealthController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-004", + "req_title": "Health Check Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/HealthController.php", + "method": "checkOpenRegister", + "class": "HealthController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-004", + "req_title": "Health Check Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/HealthController.php", + "method": "checkFilesystem", + "class": "HealthController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-004", + "req_title": "Health Check Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/HealthController.php", + "method": "getAppVersion", + "class": "HealthController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-004", + "req_title": "Health Check Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/InspectionController.php", + "method": "getRequestBody", + "class": "InspectionController", + "visibility": "private", + "capability": "inspection-checklists", + "req_id": "REQ-001", + "req_title": "Inspection checklist schema", + "confidence": 0.73, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "collectMetrics", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "getCached", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "checkDatabaseHealth", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "getCaseCounts", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "getOverdueCasesCount", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "getCasesCreatedTodayCount", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "getTaskCounts", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "getOverdueTasksCount", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "getAppVersion", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "getNextcloudVersion", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/MetricsController.php", + "method": "sanitizeLabel", + "class": "MetricsController", + "visibility": "private", + "capability": "prometheus-metrics", + "req_id": "REQ-PROM-001", + "req_title": "Metrics Endpoint", + "confidence": 0.87, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "index()" + }, + { + "file": "lib/Controller/ParaferingController.php", + "method": "handleAction", + "class": "ParaferingController", + "visibility": "private", + "capability": "voorstel-management", + "req_id": "REQ-002", + "req_title": "Create Voorstel from Case", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "createVoorstel()" + }, + { + "file": "lib/Controller/ParaferingController.php", + "method": "getRequestBody", + "class": "ParaferingController", + "visibility": "private", + "capability": "voorstel-management", + "req_id": "REQ-002", + "req_title": "Create Voorstel from Case", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "createVoorstel()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "checkZaakReadAccess", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "filterZakenByAuthorisation", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "permissionDeniedResponse", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "preValidateZaakBody", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "preValidateProductenOfDiensten", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "destroyZaak", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "resolveZaakClosedForExisting", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "checkReopenScope", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "checkIndicatieGebruiksrechtBeforeClose", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "isEindstatusByVolgnummer", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "handleEindstatusEffect", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "setIndicatieGebruiksrechtOnClose", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "handleResultaatCreated", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "deriveArchiefactiedatum", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "resolveArchiveBaseDate", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "resolveEigenschapDate", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "resolveBesluitDate", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "enrichZioResponse", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "enrichZioJsonResponse", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "syncCreateObjectInformatieObject", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "getZioDataForOioSync", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZrcController.php", + "method": "syncDeleteObjectInformatieObject", + "class": "ZrcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-003", + "req_title": "ZRC (Zaken API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "resolveParentDraft", + "class": "ZtcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "handlePublish", + "class": "ZtcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "enrichCrossReferences", + "class": "ZtcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "enrichBesluittype", + "class": "ZtcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "enrichZaaktype", + "class": "ZtcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "filterByDatumGeldigheid", + "class": "ZtcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "filterValidUrls", + "class": "ZtcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "isUrlValid", + "class": "ZtcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Controller/ZtcController.php", + "method": "resolveIotByOmschrijving", + "class": "ZtcController", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-004", + "req_title": "ZTC (Catalogi API) resources MUST be fully mappable", + "confidence": 0.82, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "patchExistingMappings", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "tplUrl", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getZaakMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getZaakTypeMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getStatusMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getStatusTypeMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getResultaatMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getResultaatTypeMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getRolMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getRolTypeMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getEigenschapMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getBesluitMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getBesluitTypeMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getInformatieObjectTypeMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getEnkelvoudigInformatieObjectMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getObjectInformatieObjectMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getGebruiksrechtenMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getKanaalMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getAbonnementMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getCatalogusMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getZaaktypeInformatieobjecttypeMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getApplicatieMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "createDefaultApplicaties", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getDefaultApplicaties", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "createDefaultKanalen", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getDefaultKanalen", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getZaakeigenschapMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getZaakinformatieobjectMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getZaakobjectMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getKlantcontactMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getBesluitinformatieobjectMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php", + "method": "getVerzendingMapping", + "class": "LoadDefaultZgwMappings", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-001", + "req_title": "Mapping engine MUST support ZGW-specific Twig filters and functions", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "loadTemplate", + "class": "CaseEmailService", + "visibility": "private", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "extractCaseNumber()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "loadCaseData", + "class": "CaseEmailService", + "visibility": "private", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "extractCaseNumber()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "recordSentEmail", + "class": "CaseEmailService", + "visibility": "private", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "extractCaseNumber()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "recordReceivedEmail", + "class": "CaseEmailService", + "visibility": "private", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "extractCaseNumber()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "findCaseByIdentifier", + "class": "CaseEmailService", + "visibility": "private", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "extractCaseNumber()" + }, + { + "file": "lib/Service/GisProxyService.php", + "method": "isUrlAllowed", + "class": "GisProxyService", + "visibility": "private", + "capability": "wms-wfs-layers", + "req_id": "REQ-LAYER-03", + "req_title": "GIS Proxy Endpoint", + "confidence": 0.83, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "proxyRequest()" + }, + { + "file": "lib/Service/GisProxyService.php", + "method": "checkRateLimit", + "class": "GisProxyService", + "visibility": "private", + "capability": "wms-wfs-layers", + "req_id": "REQ-LAYER-03", + "req_title": "GIS Proxy Endpoint", + "confidence": 0.83, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "proxyRequest()" + }, + { + "file": "lib/Service/GisProxyService.php", + "method": "parseCapabilities", + "class": "GisProxyService", + "visibility": "private", + "capability": "wms-wfs-layers", + "req_id": "REQ-LAYER-03", + "req_title": "GIS Proxy Endpoint", + "confidence": 0.83, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "proxyRequest()" + }, + { + "file": "lib/Service/GisProxyService.php", + "method": "xmlToArray", + "class": "GisProxyService", + "visibility": "private", + "capability": "wms-wfs-layers", + "req_id": "REQ-LAYER-03", + "req_title": "GIS Proxy Endpoint", + "confidence": 0.83, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "proxyRequest()" + }, + { + "file": "lib/Service/InspectionService.php", + "method": "calculateDistance", + "class": "InspectionService", + "visibility": "private", + "capability": "inspection-checklists", + "req_id": "REQ-003", + "req_title": "Inspection rapport creation", + "confidence": 0.73, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/MilestoneService.php", + "method": "getMilestoneRecords", + "class": "MilestoneService", + "visibility": "private", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-006", + "req_title": "Average processing time per case type table [V1]", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "advanceStep", + "class": "ParaferingService", + "visibility": "private", + "capability": "voorstel-management", + "req_id": "REQ-002", + "req_title": "Create Voorstel from Case", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "createVoorstel()" + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "handleParallelStep", + "class": "ParaferingService", + "visibility": "private", + "capability": "voorstel-management", + "req_id": "REQ-002", + "req_title": "Create Voorstel from Case", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "createVoorstel()" + }, + { + "file": "lib/Service/ParaferingService.php", + "method": "generateId", + "class": "ParaferingService", + "visibility": "private", + "capability": "voorstel-management", + "req_id": "REQ-002", + "req_title": "Create Voorstel from Case", + "confidence": 0.8, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "createVoorstel()" + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "seedCaseType", + "class": "SeedDataService", + "visibility": "private", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "resolveWorkflowReferences", + "class": "SeedDataService", + "visibility": "private", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "createObject", + "class": "SeedDataService", + "visibility": "private", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "findByFilter", + "class": "SeedDataService", + "visibility": "private", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "getObjectService", + "class": "SeedDataService", + "visibility": "private", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "getConfigValue", + "class": "SeedDataService", + "visibility": "private", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "getObjectId", + "class": "SeedDataService", + "visibility": "private", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/SeedDataService.php", + "method": "generateUUID", + "class": "SeedDataService", + "visibility": "private", + "capability": "vth-case-type-seed", + "req_id": "REQ-001", + "req_title": "VTH case type seed data for Vergunningen", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwBusinessRulesService.php", + "method": "dispatchToRegister", + "class": "ZgwBusinessRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwBusinessRulesService.php", + "method": "dispatchZrc", + "class": "ZgwBusinessRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwBusinessRulesService.php", + "method": "dispatchZtc", + "class": "ZgwBusinessRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwBusinessRulesService.php", + "method": "dispatchDrc", + "class": "ZgwBusinessRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwBusinessRulesService.php", + "method": "dispatchBrc", + "class": "ZgwBusinessRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwBusinessRulesService.php", + "method": "isValid", + "class": "ZgwBusinessRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "getDocumentFolder", + "class": "ZgwDocumentService", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.72, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwDocumentService.php", + "method": "getUserFolder", + "class": "ZgwDocumentService", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-005", + "req_title": "DRC (Documenten API) resources MUST be mappable", + "confidence": 0.72, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "isValid", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "error", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "fieldError", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "fieldImmutableError", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "extractUuid", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "isValidUrl", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "validateTypeUrl", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "validateInformatieobjectUrl", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "validateExternalUrl", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "fetchExternalUrl", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "generateIdentificatie", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "findObjectByField", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "findAllObjectsByField", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "findBySchemaKey", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwRulesBase.php", + "method": "checkFieldUniqueness", + "class": "ZgwRulesBase", + "visibility": "protected", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwService.php", + "method": "mapAuditTrailToZgw", + "class": "ZgwService", + "visibility": "private", + "capability": "zgw-api-mapping", + "req_id": "REQ-002", + "req_title": "ZGW API routes MUST be exposed via OpenRegister's Endpoint system", + "confidence": 0.75, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "__construct()" + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "deriveVertrouwelijkheidaanduiding", + "class": "ZgwZrcRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "rulesZakenCreate()" + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "validateSubResourceType", + "class": "ZgwZrcRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "rulesZakenCreate()" + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "validateZioInformatieobjecttype", + "class": "ZgwZrcRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "rulesZakenCreate()" + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "validateZaakFields", + "class": "ZgwZrcRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "rulesZakenCreate()" + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "validateHoofdzaakNesting", + "class": "ZgwZrcRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "rulesZakenCreate()" + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "validateProductenOfDiensten", + "class": "ZgwZrcRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "rulesZakenCreate()" + }, + { + "file": "lib/Service/ZgwZrcRulesService.php", + "method": "checkZioImmutability", + "class": "ZgwZrcRulesService", + "visibility": "private", + "capability": "zgw-business-rules-compliance", + "req_id": "ZRC-007", + "req_title": "Eindstatus and Zaak Closing", + "confidence": 0.7, + "needs_review": true, + "signal": "Pass B \u2014 inherited from public sibling in same class", + "inherits_from": "rulesZakenCreate()" + }, + { + "file": "src/App.vue", + "method": "onSidebarSearch", + "class": null, + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-001", + "req_title": "1: App MUST be a valid Nextcloud app with proper metadata", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/App.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-001", + "req_title": "1: App MUST be a valid Nextcloud app with proper metadata", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/components/map/AddressSearch.vue", + "method": "onInput", + "class": null, + "visibility": "public", + "capability": "map-component", + "req_id": "REQ-MAP-01", + "req_title": "Base Map Component", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/components/map/AddressSearch.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "map-component", + "req_id": "REQ-MAP-01", + "req_title": "Base Map Component", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/components/map/CaseMap.vue", + "method": "initMap", + "class": null, + "visibility": "public", + "capability": "map-component", + "req_id": "REQ-MAP-01", + "req_title": "Base Map Component", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/components/map/LocationPicker.vue", + "method": "initMap", + "class": null, + "visibility": "public", + "capability": "map-component", + "req_id": "REQ-MAP-01", + "req_title": "Base Map Component", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/components/map/LocationPicker.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "map-component", + "req_id": "REQ-MAP-01", + "req_title": "Base Map Component", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/components/map/LocationPicker.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "map-component", + "req_id": "REQ-MAP-01", + "req_title": "Base Map Component", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/components/map/MapLayerSwitcher.vue", + "method": "toggleLayer", + "class": null, + "visibility": "public", + "capability": "map-component", + "req_id": "REQ-MAP-01", + "req_title": "Base Map Component", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/components/map/MapLayerSwitcher.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "map-component", + "req_id": "REQ-MAP-01", + "req_title": "Base Map Component", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/components/map/SpatialFilter.vue", + "method": "initDrawLayer", + "class": null, + "visibility": "public", + "capability": "map-component", + "req_id": "REQ-MAP-01", + "req_title": "Base Map Component", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/navigation/MainMenu.vue", + "method": "openLink", + "class": null, + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-001", + "req_title": "1: App MUST be a valid Nextcloud app with proper metadata", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/CaseMapView.vue", + "method": "loadData", + "class": null, + "visibility": "public", + "capability": "case-map-overview", + "req_id": "REQ-OVERVIEW-01", + "req_title": "Cases Map View", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/Dashboard.vue", + "method": "loadDashboardData", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/Dashboard.vue", + "method": "for", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/DoorlooptijdDashboard.vue", + "method": "loadData", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/MyWork.vue", + "method": "getCaseTypeName", + "class": null, + "visibility": "public", + "capability": "my-work", + "req_id": "REQ-MYWORK-001", + "req_title": "Personal Workload View [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/Werkvoorraad.vue", + "method": "loadData", + "class": null, + "visibility": "public", + "capability": "my-work", + "req_id": "REQ-MYWORK-001", + "req_title": "Personal Workload View [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/Werkvoorraad.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "my-work", + "req_id": "REQ-MYWORK-001", + "req_title": "Personal Workload View [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/Werkvoorraad.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "my-work", + "req_id": "REQ-MYWORK-001", + "req_title": "Personal Workload View [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/CaseCreateDialog.vue", + "method": "loadCaseTypes", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/CaseDetail.vue", + "method": "getTaskPriorityLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/CaseList.vue", + "method": "loadCaseTypes", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/CaseList.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/CaseList.vue", + "method": "for", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/ActivityTimeline.vue", + "method": "getIcon", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AddParticipantDialog.vue", + "method": "submit", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AddParticipantDialog.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AdvicePanel.vue", + "method": "defaultDeadline", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AdviceRequestPanel.vue", + "method": "getStatusLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AiAssistantPanel.vue", + "method": "askQuestion", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AiAssistantPanel.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AiClassifyDialog.vue", + "method": "classify", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AiExtractDialog.vue", + "method": "extract", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AiSuggestionCard.vue", + "method": "formatValue", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AiSuggestionCard.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AiSummaryPanel.vue", + "method": "generate", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AppointmentBookingDialog.vue", + "method": "loadSlots", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AppointmentBookingDialog.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/AppointmentSection.vue", + "method": "loadAppointments", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/BerichtenboxComposeDialog.vue", + "method": "validate", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/BerichtenboxComposeDialog.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/BerichtenboxTab.vue", + "method": "loadMessages", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/CaseTransferDialog.vue", + "method": "submitTransfer", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/ConsultationPanel.vue", + "method": "getStatusLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/CreateShareDialog.vue", + "method": "createShare", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/CustomPropertiesPanel.vue", + "method": "loadData", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/DecisionsSection.vue", + "method": "loadData", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/DocumentAssessmentPanel.vue", + "method": "getAssessment", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/DocumentChecklist.vue", + "method": "loadData", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/EmailComposer.vue", + "method": "onTemplateSelected", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/EmailComposer.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/EmailThread.vue", + "method": "formatDateTime", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/EmailThread.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/EmailThread.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/EnforcementPanel.vue", + "method": "statusLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/EnforcementWizard.vue", + "method": "submit", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/InspectionChecklistPanel.vue", + "method": "startInspection", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/InspectionPanel.vue", + "method": "resultLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/LocationTab.vue", + "method": "loadAddress", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/LocationTab.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/MilestoneProgress.vue", + "method": "stepClass", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/ParticipantsSection.vue", + "method": "fetchData", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/QuickStatusDropdown.vue", + "method": "onStatusChange", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/QuickStatusDropdown.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/ResultSection.vue", + "method": "formatPeriod", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/ResultSection.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/ResultSection.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/ResultSection.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/ShareTab.vue", + "method": "permissionLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/StatusTimeline.vue", + "method": "isPassed", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/SubCasesSection.vue", + "method": "fetchSubCases", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/SubCasesSection.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/SubCasesSection.vue", + "method": "for", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/TenantSwitcher.vue", + "method": "switchTenant", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/TenantSwitcher.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/VoorstellenPanel.vue", + "method": "loadVoorstellen", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/WooIntakeForm.vue", + "method": "update", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/WorkflowTransitions.vue", + "method": "loadWorkflow", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/WorkflowTransitions.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/WorkflowTransitions.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/beroep/BeroepEscalationPanel.vue", + "method": "escalate", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/beroep/CourtProceedingsPanel.vue", + "method": "getRulingLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/bezwaar/AdvisoryReportPanel.vue", + "method": "getAdviceTypeLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/bezwaar/BezwaarDecisionForm.vue", + "method": "getDispositionLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/bezwaar/BezwaarIntakeForm.vue", + "method": "loadExistingObjection", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/bezwaar/BezwaarIntakeForm.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/bezwaar/BezwaarIntakeForm.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/bezwaar/BezwaarTimeline.vue", + "method": "getAdviceTypeLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/components/bezwaar/HearingPanel.vue", + "method": "getHearingStatusLabel", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseDocumentsWidget.vue", + "method": "getFileIcon", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseDocumentsWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseDocumentsWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseDocumentsWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseDocumentsWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CasePropertiesWidget.vue", + "method": "save", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CasePropertiesWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseTasksWidget.vue", + "method": "dueDateClass", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseTasksWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseTasksWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseTimelineWidget.vue", + "method": "onStatusSelected", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/cases/widgets/CaseTimelineWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-dashboard-view", + "req_id": "REQ-CDV-01", + "req_title": "Integrated Case Working Screen", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/complaints/ComplaintDetail.vue", + "method": "loadComplaint", + "class": null, + "visibility": "public", + "capability": "bezwaar-lifecycle", + "req_id": "REQ-001", + "req_title": "Bezwaar Case Type Pre-Seeded Configuration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/complaints/ComplaintList.vue", + "method": "loadComplaints", + "class": null, + "visibility": "public", + "capability": "bezwaar-lifecycle", + "req_id": "REQ-001", + "req_title": "Bezwaar Case Type Pre-Seeded Configuration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/complaints/components/ComplaintCreateDialog.vue", + "method": "validate", + "class": null, + "visibility": "public", + "capability": "bezwaar-lifecycle", + "req_id": "REQ-001", + "req_title": "Bezwaar Case Type Pre-Seeded Configuration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/complaints/components/ComplaintCreateDialog.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "bezwaar-lifecycle", + "req_id": "REQ-001", + "req_title": "Bezwaar Case Type Pre-Seeded Configuration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/dashboard/ActivityFeed.vue", + "method": "typeIcon", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/dashboard/CaseMapWidget.vue", + "method": "getColor", + "class": null, + "visibility": "public", + "capability": "case-map-overview", + "req_id": "REQ-OVERVIEW-01", + "req_title": "Cases Map View", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/dashboard/CaseMapWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-map-overview", + "req_id": "REQ-OVERVIEW-01", + "req_title": "Cases Map View", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/dashboard/CaseMapWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-map-overview", + "req_id": "REQ-OVERVIEW-01", + "req_title": "Cases Map View", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/dashboard/CaseMapWidget.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "case-map-overview", + "req_id": "REQ-OVERVIEW-01", + "req_title": "Cases Map View", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/dashboard/OverduePanel.vue", + "method": "severityClass", + "class": null, + "visibility": "public", + "capability": "signalering-widgets", + "req_id": "REQ-001", + "req_title": "Deadline Alerts Widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/dashboard/OverduePanel.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "signalering-widgets", + "req_id": "REQ-001", + "req_title": "Deadline Alerts Widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/dashboard/OverduePanel.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "signalering-widgets", + "req_id": "REQ-001", + "req_title": "Deadline Alerts Widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/dashboard/StatusChart.vue", + "method": "barWidth", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/AdminRoot.vue", + "method": "reimport", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/CaseTypeAdmin.vue", + "method": "openDetail", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/CaseTypeDetail.vue", + "method": "loadCaseType", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/CaseTypeDetail.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/CaseTypeList.vue", + "method": "fetchCaseTypes", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/CaseTypeList.vue", + "method": "for", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/MapLayerSettings.vue", + "method": "emptyForm", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/ParafeerRouteAdmin.vue", + "method": "loadData", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/PartnerAdmin.vue", + "method": "editPartner", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/Settings.vue", + "method": "save", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/Settings.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/Settings.vue", + "method": "setTimeout", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/WorkflowEditor.vue", + "method": "loadData", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/ZgwMappingSettings.vue", + "method": "editMapping", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/DurationPicker.vue", + "method": "onDaysChange", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/DurationPicker.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/LhsMatrixAdmin.vue", + "method": "updateCell", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/LhsMatrixAdmin.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/StepConfigPanel.vue", + "method": "parseChecklist", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/StepConfigPanel.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/StepConfigPanel.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/TransitionConfigPanel.vue", + "method": "parseGuards", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/TransitionConfigPanel.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/TransitionConfigPanel.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/VthTemplateLibrary.vue", + "method": "selectTemplate", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/WorkflowNode.vue", + "method": "onMouseDown", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/components/WorkflowPalette.vue", + "method": "onDragStart", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/AiSettingsTab.vue", + "method": "updateSetting", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/AppointmentSettingsTab.vue", + "method": "saveBackend", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/BerichtenboxSettingsTab.vue", + "method": "testConnection", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/ChecklistAdmin.vue", + "method": "createChecklist", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/DocumentTypesTab.vue", + "method": "loadItems", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/PropertiesTab.vue", + "method": "fetchPropertyDefs", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/ResultTypesTab.vue", + "method": "loadItems", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/ResultsTab.vue", + "method": "formatPeriod", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/ResultsTab.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/ResultsTab.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/RoleTypesTab.vue", + "method": "loadItems", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/RolesTab.vue", + "method": "genericRoleLabel", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/StatusesTab.vue", + "method": "getEmptyForm", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/TemplatesTab.vue", + "method": "loadTemplates", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/TemplatesTab.vue", + "method": "generateUrl", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/TenantSettingsTab.vue", + "method": "create", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/WorkflowTab.vue", + "method": "loadVersions", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/settings/tabs/WorkflowTab.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "admin-settings", + "req_id": "REQ-ADMIN-001", + "req_title": "Nextcloud Admin Panel Registration [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/tasks/TaskCreateDialog.vue", + "method": "submit", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/tasks/TaskCreateDialog.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/tasks/TaskDetail.vue", + "method": "startEditing", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/tasks/TaskList.vue", + "method": "getPriorityLabel", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/VoorstelDetail.vue", + "method": "loadVoorstel", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/VoorstelList.vue", + "method": "loadVoorstellen", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/components/AuditTrail.vue", + "method": "formatAction", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/components/BesluitRegistration.vue", + "method": "register", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/components/BesluitRegistration.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/components/ParafeerActionBar.vue", + "method": "formatStepType", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/components/ParafeerInbox.vue", + "method": "loadVoorstellen", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/components/ProgressTimeline.vue", + "method": "isCompleted", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/components/VoorstelCreateDialog.vue", + "method": "onCaseSelected", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/voorstellen/components/VoorstelCreateDialog.vue", + "method": "if", + "class": null, + "visibility": "public", + "capability": "voorstel-management", + "req_id": "REQ-001", + "req_title": "Voorstel Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/widgets/CasesOverviewWidget.vue", + "method": "onShow", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/widgets/DeadlineAlertsWidget.vue", + "method": "onShow", + "class": null, + "visibility": "public", + "capability": "signalering-widgets", + "req_id": "REQ-001", + "req_title": "Deadline Alerts Widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/widgets/MyTasksWidget.vue", + "method": "onShow", + "class": null, + "visibility": "public", + "capability": "my-work", + "req_id": "REQ-MYWORK-001", + "req_title": "Personal Workload View [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/widgets/OverdueCasesWidget.vue", + "method": "onShow", + "class": null, + "visibility": "public", + "capability": "signalering-widgets", + "req_id": "REQ-001", + "req_title": "Deadline Alerts Widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/widgets/StalledCasesWidget.vue", + "method": "onShow", + "class": null, + "visibility": "public", + "capability": "signalering-widgets", + "req_id": "REQ-001", + "req_title": "Deadline Alerts Widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/widgets/StartCaseWidget.vue", + "method": "fetchCaseTypes", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/views/widgets/TaskRemindersWidget.vue", + "method": "onShow", + "class": null, + "visibility": "public", + "capability": "signalering-widgets", + "req_id": "REQ-001", + "req_title": "Deadline Alerts Widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/coordinateService.js", + "method": "isRDCoordinate", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/coordinateService.js", + "method": "rdToWgs84", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/coordinateService.js", + "method": "wgs84ToRd", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/coordinateService.js", + "method": "ensureWgs84", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/coordinateService.js", + "method": "convertCoordinates", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/gisProxyService.js", + "method": "proxyRequest", + "class": null, + "visibility": "public", + "capability": "wms-wfs-layers", + "req_id": "REQ-LAYER-01", + "req_title": "Admin Layer Configuration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/gisProxyService.js", + "method": "getCapabilities", + "class": null, + "visibility": "public", + "capability": "wms-wfs-layers", + "req_id": "REQ-LAYER-01", + "req_title": "Admin Layer Configuration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/pdokService.js", + "method": "suggest", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/pdokService.js", + "method": "lookup", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/pdokService.js", + "method": "free", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/pdokService.js", + "method": "reverse", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/pdokService.js", + "method": "extractCoordinates", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/pdokService.js", + "method": "formatAddress", + "class": null, + "visibility": "public", + "capability": "pdok-integration", + "req_id": "REQ-PDOK-01", + "req_title": "PDOK Tile Services (Base Maps)", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/taskApi.js", + "method": "getHeaders", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/taskApi.js", + "method": "mapCalDavPriority", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/taskApi.js", + "method": "normalizeCalDavTask", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/taskApi.js", + "method": "fetchTasksForObject", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/services/taskApi.js", + "method": "fetchTasksForCases", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/store/modules/bezwaar.js", + "method": "addWorkingDays", + "class": null, + "visibility": "public", + "capability": "procest-object-store", + "req_id": "REQ-001", + "req_title": "1: Object store MUST use createObjectStore from shared library with plugins", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/store/modules/bezwaar.js", + "method": "addWeeks", + "class": null, + "visibility": "public", + "capability": "procest-object-store", + "req_id": "REQ-001", + "req_title": "1: Object store MUST use createObjectStore from shared library with plugins", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/store/modules/bezwaar.js", + "method": "daysDifference", + "class": null, + "visibility": "public", + "capability": "procest-object-store", + "req_id": "REQ-001", + "req_title": "1: Object store MUST use createObjectStore from shared library with plugins", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/store/modules/workflow.js", + "method": "generateUUID", + "class": null, + "visibility": "public", + "capability": "procest-object-store", + "req_id": "REQ-001", + "req_title": "1: Object store MUST use createObjectStore from shared library with plugins", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/store/store.js", + "method": "initializeStores", + "class": null, + "visibility": "public", + "capability": "procest-object-store", + "req_id": "REQ-001", + "req_title": "1: Object store MUST use createObjectStore from shared library with plugins", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "calculateDeadline", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "generateIdentifier", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "isCaseOverdue", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "isCaseDueToday", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "isCaseDueTomorrow", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "getCaseOverdueText", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "formatDeadlineCountdown", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "getDaysElapsed", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "getDaysRemaining", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "formatDate", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseHelpers.js", + "method": "formatDateShort", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseTypeValidation.js", + "method": "getOriginOptions", + "class": null, + "visibility": "public", + "capability": "case-types", + "req_id": "REQ-CT-01", + "req_title": "Case Type CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseTypeValidation.js", + "method": "getConfidentialityOptions", + "class": null, + "visibility": "public", + "capability": "case-types", + "req_id": "REQ-CT-01", + "req_title": "Case Type CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseTypeValidation.js", + "method": "validateCaseType", + "class": null, + "visibility": "public", + "capability": "case-types", + "req_id": "REQ-CT-01", + "req_title": "Case Type CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseTypeValidation.js", + "method": "validateForPublish", + "class": null, + "visibility": "public", + "capability": "case-types", + "req_id": "REQ-CT-01", + "req_title": "Case Type CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseTypeValidation.js", + "method": "getFieldLabel", + "class": null, + "visibility": "public", + "capability": "case-types", + "req_id": "REQ-CT-01", + "req_title": "Case Type CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseValidation.js", + "method": "isCaseTypeUsable", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseValidation.js", + "method": "getCaseTypeUnusableReason", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseValidation.js", + "method": "validateCaseCreate", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseValidation.js", + "method": "validateCaseUpdate", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/caseValidation.js", + "method": "validateStatusChange", + "class": null, + "visibility": "public", + "capability": "case-management", + "req_id": "REQ-CM-01", + "req_title": "Case Creation", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "todayString", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "computeKpis", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "aggregateByStatus", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "getOverdueCases", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "getRecentActivity", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "getMyWorkItems", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "endOfWeek", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "getGroupedMyWorkItems", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "getDeadlineAlerts", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "getTaskDueReminders", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "getStalledCases", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/dashboardHelpers.js", + "method": "formatRelativeTime", + "class": null, + "visibility": "public", + "capability": "dashboard", + "req_id": "REQ-DASH-001", + "req_title": "KPI Cards Row [MVP]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/decisionHelpers.js", + "method": "getDecisionValidity", + "class": null, + "visibility": "public", + "capability": "roles-decisions", + "req_id": "REQ-ROLE-001", + "req_title": "Role Assignment on Cases", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/decisionHelpers.js", + "method": "formatDecisionDate", + "class": null, + "visibility": "public", + "capability": "roles-decisions", + "req_id": "REQ-ROLE-001", + "req_title": "Role Assignment on Cases", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/decisionHelpers.js", + "method": "validateDecision", + "class": null, + "visibility": "public", + "capability": "roles-decisions", + "req_id": "REQ-ROLE-001", + "req_title": "Role Assignment on Cases", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/doorlooptijdHelpers.js", + "method": "parseDurationToDays", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/doorlooptijdHelpers.js", + "method": "getProcessingDays", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/doorlooptijdHelpers.js", + "method": "getSlaTargetDays", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/doorlooptijdHelpers.js", + "method": "buildCaseTypeMap", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/doorlooptijdHelpers.js", + "method": "computeSlaCompliance", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/doorlooptijdHelpers.js", + "method": "computeProcessingTimeDistribution", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/doorlooptijdHelpers.js", + "method": "computeMonthlyTrend", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/doorlooptijdHelpers.js", + "method": "getAtRiskCases", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/doorlooptijdHelpers.js", + "method": "computePerformanceTable", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/durationHelpers.js", + "method": "isValidDuration", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/durationHelpers.js", + "method": "parseDuration", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/durationHelpers.js", + "method": "formatDuration", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/durationHelpers.js", + "method": "getDurationError", + "class": null, + "visibility": "public", + "capability": "doorlooptijd-dashboard", + "req_id": "REQ-001", + "req_title": "SLA compliance rate widget [V1]", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/i18nResolver.js", + "method": "getUserLocale", + "class": null, + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-001", + "req_title": "1: App MUST be a valid Nextcloud app with proper metadata", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/i18nResolver.js", + "method": "resolveTranslatable", + "class": null, + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-001", + "req_title": "1: App MUST be a valid Nextcloud app with proper metadata", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/i18nResolver.js", + "method": "resolveField", + "class": null, + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-001", + "req_title": "1: App MUST be a valid Nextcloud app with proper metadata", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/i18nResolver.js", + "method": "resolveText", + "class": null, + "visibility": "public", + "capability": "procest-app-scaffold", + "req_id": "REQ-001", + "req_title": "1: App MUST be a valid Nextcloud app with proper metadata", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/openregisterCheck.js", + "method": "checkOpenRegisterStatus", + "class": null, + "visibility": "public", + "capability": "openregister-integration", + "req_id": "REQ-OREG-001", + "req_title": "Configuration File", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/openregisterCheck.js", + "method": "getStatusMessage", + "class": null, + "visibility": "public", + "capability": "openregister-integration", + "req_id": "REQ-OREG-001", + "req_title": "Configuration File", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/parafeerEngine.js", + "method": "getRouteSteps", + "class": null, + "visibility": "public", + "capability": "parafeerroute-engine", + "req_id": "REQ-001", + "req_title": "Parafeerroute Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/parafeerEngine.js", + "method": "getCurrentStep", + "class": null, + "visibility": "public", + "capability": "parafeerroute-engine", + "req_id": "REQ-001", + "req_title": "Parafeerroute Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/parafeerEngine.js", + "method": "isActiveActor", + "class": null, + "visibility": "public", + "capability": "parafeerroute-engine", + "req_id": "REQ-001", + "req_title": "Parafeerroute Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/parafeerEngine.js", + "method": "getNextStep", + "class": null, + "visibility": "public", + "capability": "parafeerroute-engine", + "req_id": "REQ-001", + "req_title": "Parafeerroute Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/parafeerEngine.js", + "method": "getStatusAfterAdvance", + "class": null, + "visibility": "public", + "capability": "parafeerroute-engine", + "req_id": "REQ-001", + "req_title": "Parafeerroute Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/parafeerEngine.js", + "method": "createRouteSnapshot", + "class": null, + "visibility": "public", + "capability": "parafeerroute-engine", + "req_id": "REQ-001", + "req_title": "Parafeerroute Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/parafeerEngine.js", + "method": "insertAdHocStep", + "class": null, + "visibility": "public", + "capability": "parafeerroute-engine", + "req_id": "REQ-001", + "req_title": "Parafeerroute Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/parafeerEngine.js", + "method": "markStepSkipped", + "class": null, + "visibility": "public", + "capability": "parafeerroute-engine", + "req_id": "REQ-001", + "req_title": "Parafeerroute Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/parafeerEngine.js", + "method": "findDefaultRoute", + "class": null, + "visibility": "public", + "capability": "parafeerroute-engine", + "req_id": "REQ-001", + "req_title": "Parafeerroute Schema Registration", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskHelpers.js", + "method": "getPriorityLevels", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskHelpers.js", + "method": "isOverdue", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskHelpers.js", + "method": "isDueToday", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskHelpers.js", + "method": "getOverdueText", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskHelpers.js", + "method": "formatDueDate", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskHelpers.js", + "method": "prioritySortWeight", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskHelpers.js", + "method": "statusGroupWeight", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskHelpers.js", + "method": "sortTasks", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskLifecycle.js", + "method": "getStatusLabels", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskLifecycle.js", + "method": "getTransitionLabels", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskLifecycle.js", + "method": "getAllowedTransitions", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskLifecycle.js", + "method": "validateTransition", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskLifecycle.js", + "method": "getStatusLabel", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskLifecycle.js", + "method": "getTransitionLabel", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskLifecycle.js", + "method": "isTerminalStatus", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskValidation.js", + "method": "validateTaskCreate", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskValidation.js", + "method": "validateTaskUpdate", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + }, + { + "file": "src/utils/taskValidation.js", + "method": "validateTaskTransition", + "class": null, + "visibility": "public", + "capability": "task-management", + "req_id": "REQ-TASK-001", + "req_title": "Task CRUD", + "confidence": 0.78, + "needs_review": true, + "signal": "frontend path-based capability match; specific REQ per method deferred", + "inherits_from": null + } + ], + "bucket_2a": { + "workflow-import-export": [ + { + "file": "lib/Controller/CaseDefinitionController.php", + "method": "export", + "observed_behavior": "CaseDefinitionController::export()" + }, + { + "file": "lib/Controller/CaseDefinitionController.php", + "method": "validate", + "observed_behavior": "CaseDefinitionController::validate()" + }, + { + "file": "lib/Controller/CaseDefinitionController.php", + "method": "import", + "observed_behavior": "CaseDefinitionController::import()" + }, + { + "file": "lib/Service/CaseDefinitionExportService.php", + "method": "exportCaseDefinition", + "observed_behavior": "CaseDefinitionExportService::exportCaseDefinition()" + }, + { + "file": "lib/Service/CaseDefinitionImportService.php", + "method": "validatePackage", + "observed_behavior": "CaseDefinitionImportService::validatePackage()" + }, + { + "file": "lib/Service/CaseDefinitionImportService.php", + "method": "importCaseDefinition", + "observed_behavior": "CaseDefinitionImportService::importCaseDefinition()" + }, + { + "file": "lib/Service/CaseDefinitionExportService.php", + "method": "buildManifest", + "observed_behavior": "CaseDefinitionExportService::buildManifest()" + }, + { + "file": "lib/Service/CaseDefinitionExportService.php", + "method": "exportComponent", + "observed_behavior": "CaseDefinitionExportService::exportComponent()" + }, + { + "file": "lib/Service/CaseDefinitionExportService.php", + "method": "incrementVersion", + "observed_behavior": "CaseDefinitionExportService::incrementVersion()" + }, + { + "file": "lib/Service/CaseDefinitionImportService.php", + "method": "importComponent", + "observed_behavior": "CaseDefinitionImportService::importComponent()" + }, + { + "file": "lib/Service/CaseDefinitionImportService.php", + "method": "importWorkflows", + "observed_behavior": "CaseDefinitionImportService::importWorkflows()" + } + ], + "advice-management": [ + { + "file": "lib/Controller/ConsultationController.php", + "method": "index", + "observed_behavior": "ConsultationController::index()" + }, + { + "file": "lib/Controller/ConsultationController.php", + "method": "create", + "observed_behavior": "ConsultationController::create()" + }, + { + "file": "lib/Controller/ConsultationController.php", + "method": "updateStatus", + "observed_behavior": "ConsultationController::updateStatus()" + }, + { + "file": "lib/Controller/ConsultationController.php", + "method": "submitResponse", + "observed_behavior": "ConsultationController::submitResponse()" + }, + { + "file": "lib/Controller/ConsultationController.php", + "method": "overdue", + "observed_behavior": "ConsultationController::overdue()" + }, + { + "file": "lib/Service/ConsultationService.php", + "method": "createConsultation", + "observed_behavior": "ConsultationService::createConsultation()" + }, + { + "file": "lib/Service/ConsultationService.php", + "method": "getConsultationsForCase", + "observed_behavior": "ConsultationService::getConsultationsForCase()" + }, + { + "file": "lib/Service/ConsultationService.php", + "method": "updateStatus", + "observed_behavior": "ConsultationService::updateStatus()" + }, + { + "file": "lib/Service/ConsultationService.php", + "method": "submitResponse", + "observed_behavior": "ConsultationService::submitResponse()" + }, + { + "file": "lib/Service/ConsultationService.php", + "method": "getOverdueConsultations", + "observed_behavior": "ConsultationService::getOverdueConsultations()" + } + ], + "case-management": [ + { + "file": "lib/Controller/EmailController.php", + "method": "send", + "observed_behavior": "EmailController::send()" + }, + { + "file": "lib/Controller/EmailController.php", + "method": "sendFromTemplate", + "observed_behavior": "EmailController::sendFromTemplate()" + }, + { + "file": "lib/Controller/EmailController.php", + "method": "preview", + "observed_behavior": "EmailController::preview()" + }, + { + "file": "lib/Controller/EmailController.php", + "method": "templates", + "observed_behavior": "EmailController::templates()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "sendEmail", + "observed_behavior": "CaseEmailService::sendEmail()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "sendFromTemplate", + "observed_behavior": "CaseEmailService::sendFromTemplate()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "resolveVariables", + "observed_behavior": "CaseEmailService::resolveVariables()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "findUnresolvedVariables", + "observed_behavior": "CaseEmailService::findUnresolvedVariables()" + }, + { + "file": "lib/Service/CaseEmailService.php", + "method": "processInbound", + "observed_behavior": "CaseEmailService::processInbound()" + } + ], + "wms-wfs-layers": [ + { + "file": "lib/Controller/GisProxyController.php", + "method": "capabilities", + "observed_behavior": "GisProxyController::capabilities()" + }, + { + "file": "lib/Service/GisProxyService.php", + "method": "getCapabilities", + "observed_behavior": "GisProxyService::getCapabilities()" + } + ], + "admin-settings": [ + { + "file": "lib/Controller/SettingsController.php", + "method": "getObjectService", + "observed_behavior": "SettingsController::getObjectService()" + }, + { + "file": "lib/Controller/SettingsController.php", + "method": "getConfigurationService", + "observed_behavior": "SettingsController::getConfigurationService()" + }, + { + "file": "lib/Controller/SettingsController.php", + "method": "index", + "observed_behavior": "SettingsController::index()" + }, + { + "file": "lib/Controller/SettingsController.php", + "method": "create", + "observed_behavior": "SettingsController::create()" + }, + { + "file": "lib/Controller/SettingsController.php", + "method": "load", + "observed_behavior": "SettingsController::load()" + }, + { + "file": "lib/Service/SettingsService.php", + "method": "isOpenRegisterAvailable", + "observed_behavior": "SettingsService::isOpenRegisterAvailable()" + }, + { + "file": "lib/Service/SettingsService.php", + "method": "loadConfiguration", + "observed_behavior": "SettingsService::loadConfiguration()" + }, + { + "file": "lib/Service/SettingsService.php", + "method": "getSettings", + "observed_behavior": "SettingsService::getSettings()" + }, + { + "file": "lib/Service/SettingsService.php", + "method": "updateSettings", + "observed_behavior": "SettingsService::updateSettings()" + }, + { + "file": "lib/Service/SettingsService.php", + "method": "getConfigValue", + "observed_behavior": "SettingsService::getConfigValue()" + }, + { + "file": "lib/Service/SettingsService.php", + "method": "setConfigValue", + "observed_behavior": "SettingsService::setConfigValue()" + }, + { + "file": "lib/Service/SettingsService.php", + "method": "autoConfigureAfterImport", + "observed_behavior": "SettingsService::autoConfigureAfterImport()" + } + ], + "zgw-api-mapping": [ + { + "file": "lib/Middleware/ZgwAuthException.php", + "method": "getStatusCode", + "observed_behavior": "Exception type for ZgwAuthMiddleware" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php", + "method": "beforeController", + "observed_behavior": "ZGW scope-based auth; no REQ covers auth contract" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php", + "method": "afterException", + "observed_behavior": "ZGW scope-based auth; no REQ covers auth contract" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php", + "method": "isConfidentialityAllowed", + "observed_behavior": "ZGW scope-based auth; no REQ covers auth contract" + }, + { + "file": "lib/Service/NotificatieService.php", + "method": "publish", + "observed_behavior": "NotificatieService::publish()" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php", + "method": "loadOpenRegisterServices", + "observed_behavior": "ZGW scope-based auth; no REQ covers auth contract" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php", + "method": "enforceScopes", + "observed_behavior": "ZGW scope-based auth; no REQ covers auth contract" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php", + "method": "scopeGrantCovers", + "observed_behavior": "ZGW scope-based auth; no REQ covers auth contract" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php", + "method": "decodeJwtPayload", + "observed_behavior": "ZGW scope-based auth; no REQ covers auth contract" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php", + "method": "findConsumerByIssuer", + "observed_behavior": "ZGW scope-based auth; no REQ covers auth contract" + }, + { + "file": "lib/Service/NotificatieService.php", + "method": "loadOpenRegisterServices", + "observed_behavior": "NotificatieService::loadOpenRegisterServices()" + }, + { + "file": "lib/Service/NotificatieService.php", + "method": "deliver", + "observed_behavior": "NotificatieService::deliver()" + }, + { + "file": "lib/Service/NotificatieService.php", + "method": "deliverToSubscription", + "observed_behavior": "NotificatieService::deliverToSubscription()" + } + ], + "zgw-business-rules-compliance": [ + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "rulesBesluitenCreate", + "observed_behavior": "ZgwBrcRulesService::rulesBesluitenCreate()" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "rulesBesluitenUpdate", + "observed_behavior": "ZgwBrcRulesService::rulesBesluitenUpdate()" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "rulesBesluitenPatch", + "observed_behavior": "ZgwBrcRulesService::rulesBesluitenPatch()" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "rulesBesluitinformatieobjectenCreate", + "observed_behavior": "ZgwBrcRulesService::rulesBesluitinformatieobjectenCreate()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "rulesEnkelvoudiginformatieobjectenCreate", + "observed_behavior": "ZgwDrcRulesService::rulesEnkelvoudiginformatieobjectenCreate()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "rulesEnkelvoudiginformatieobjectenUpdate", + "observed_behavior": "ZgwDrcRulesService::rulesEnkelvoudiginformatieobjectenUpdate()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "rulesEnkelvoudiginformatieobjectenPatch", + "observed_behavior": "ZgwDrcRulesService::rulesEnkelvoudiginformatieobjectenPatch()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "rulesEnkelvoudiginformatieobjectenDestroy", + "observed_behavior": "ZgwDrcRulesService::rulesEnkelvoudiginformatieobjectenDestroy()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "rulesObjectinformatieobjectenCreate", + "observed_behavior": "ZgwDrcRulesService::rulesObjectinformatieobjectenCreate()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "checkConceptProtection", + "observed_behavior": "ZgwZtcRulesService::checkConceptProtection()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "defaultConcept", + "observed_behavior": "ZgwZtcRulesService::defaultConcept()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "preserveConcept", + "observed_behavior": "ZgwZtcRulesService::preserveConcept()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "rulesZaaktypenCreate", + "observed_behavior": "ZgwZtcRulesService::rulesZaaktypenCreate()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "rulesBesluittypenCreate", + "observed_behavior": "ZgwZtcRulesService::rulesBesluittypenCreate()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "rulesZaaktypeinformatieobjecttypenCreate", + "observed_behavior": "ZgwZtcRulesService::rulesZaaktypeinformatieobjecttypenCreate()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "rulesResultaattypenCreate", + "observed_behavior": "ZgwZtcRulesService::rulesResultaattypenCreate()" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "checkBesluitTypeImmutability", + "observed_behavior": "ZgwBrcRulesService::checkBesluitTypeImmutability()" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "checkBesluitFieldImmutability", + "observed_behavior": "ZgwBrcRulesService::checkBesluitFieldImmutability()" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "preserveImmutableBesluitFields", + "observed_behavior": "ZgwBrcRulesService::preserveImmutableBesluitFields()" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "checkBesluitIdentificatieUnique", + "observed_behavior": "ZgwBrcRulesService::checkBesluitIdentificatieUnique()" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "validateZaakBesluittypeRelation", + "observed_behavior": "ZgwBrcRulesService::validateZaakBesluittypeRelation()" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php", + "method": "validateBioInformatieobjecttype", + "observed_behavior": "ZgwBrcRulesService::validateBioInformatieobjecttype()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "findOioRelationsForDocument", + "observed_behavior": "ZgwDrcRulesService::findOioRelationsForDocument()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "validateIndicatieGebruiksrechtTrue", + "observed_behavior": "ZgwDrcRulesService::validateIndicatieGebruiksrechtTrue()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "validateObjectUrl", + "observed_behavior": "ZgwDrcRulesService::validateObjectUrl()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "validateOioCrossRegister", + "observed_behavior": "ZgwDrcRulesService::validateOioCrossRegister()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "checkOioUniqueness", + "observed_behavior": "ZgwDrcRulesService::checkOioUniqueness()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "searchDuplicateRelation", + "observed_behavior": "ZgwDrcRulesService::searchDuplicateRelation()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "validateLock", + "observed_behavior": "ZgwDrcRulesService::validateLock()" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php", + "method": "deriveVertrouwelijkheidaanduiding", + "observed_behavior": "ZgwDrcRulesService::deriveVertrouwelijkheidaanduiding()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "checkDirectConceptProtection", + "observed_behavior": "ZgwZtcRulesService::checkDirectConceptProtection()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "actionLabel", + "observed_behavior": "ZgwZtcRulesService::actionLabel()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "validateBrondatumArchief", + "observed_behavior": "ZgwZtcRulesService::validateBrondatumArchief()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "enrichResultaattype", + "observed_behavior": "ZgwZtcRulesService::enrichResultaattype()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "validateProcestypeMatch", + "observed_behavior": "ZgwZtcRulesService::validateProcestypeMatch()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "validateFieldPresence", + "observed_behavior": "ZgwZtcRulesService::validateFieldPresence()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "checkProcestermijnCompatibility", + "observed_behavior": "ZgwZtcRulesService::checkProcestermijnCompatibility()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "resolveTypeReferences", + "observed_behavior": "ZgwZtcRulesService::resolveTypeReferences()" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php", + "method": "resolveGerelateerdeZaaktypen", + "observed_behavior": "ZgwZtcRulesService::resolveGerelateerdeZaaktypen()" + } + ] + }, + "bucket_2b": { + "appointments": [ + { + "file": "lib/BackgroundJob/AppointmentReminderJob.php", + "method": "run", + "observed_behavior": "AppointmentReminderJob::run()" + }, + { + "file": "lib/Controller/AppointmentController.php", + "method": "index", + "observed_behavior": "AppointmentController::index()" + }, + { + "file": "lib/Controller/AppointmentController.php", + "method": "create", + "observed_behavior": "AppointmentController::create()" + }, + { + "file": "lib/Controller/AppointmentController.php", + "method": "cancel", + "observed_behavior": "AppointmentController::cancel()" + }, + { + "file": "lib/Controller/AppointmentController.php", + "method": "noShow", + "observed_behavior": "AppointmentController::noShow()" + }, + { + "file": "lib/Controller/AppointmentController.php", + "method": "timeslots", + "observed_behavior": "AppointmentController::timeslots()" + }, + { + "file": "lib/Controller/PublicAppointmentController.php", + "method": "view", + "observed_behavior": "PublicAppointmentController::view()" + }, + { + "file": "lib/Controller/PublicAppointmentController.php", + "method": "cancel", + "observed_behavior": "PublicAppointmentController::cancel()" + }, + { + "file": "lib/Service/AppointmentBackend/JccBackend.php", + "method": "getTimeslots", + "observed_behavior": "JccBackend::getTimeslots()" + }, + { + "file": "lib/Service/AppointmentBackend/JccBackend.php", + "method": "bookAppointment", + "observed_behavior": "JccBackend::bookAppointment()" + }, + { + "file": "lib/Service/AppointmentBackend/JccBackend.php", + "method": "cancelAppointment", + "observed_behavior": "JccBackend::cancelAppointment()" + }, + { + "file": "lib/Service/AppointmentBackend/JccBackend.php", + "method": "rescheduleAppointment", + "observed_behavior": "JccBackend::rescheduleAppointment()" + }, + { + "file": "lib/Service/AppointmentBackend/LocalBackend.php", + "method": "getTimeslots", + "observed_behavior": "LocalBackend::getTimeslots()" + }, + { + "file": "lib/Service/AppointmentBackend/LocalBackend.php", + "method": "bookAppointment", + "observed_behavior": "LocalBackend::bookAppointment()" + }, + { + "file": "lib/Service/AppointmentBackend/LocalBackend.php", + "method": "cancelAppointment", + "observed_behavior": "LocalBackend::cancelAppointment()" + }, + { + "file": "lib/Service/AppointmentBackend/LocalBackend.php", + "method": "rescheduleAppointment", + "observed_behavior": "LocalBackend::rescheduleAppointment()" + }, + { + "file": "lib/Service/AppointmentBackend/QmaticBackend.php", + "method": "getTimeslots", + "observed_behavior": "QmaticBackend::getTimeslots()" + }, + { + "file": "lib/Service/AppointmentBackend/QmaticBackend.php", + "method": "bookAppointment", + "observed_behavior": "QmaticBackend::bookAppointment()" + }, + { + "file": "lib/Service/AppointmentBackend/QmaticBackend.php", + "method": "cancelAppointment", + "observed_behavior": "QmaticBackend::cancelAppointment()" + }, + { + "file": "lib/Service/AppointmentBackend/QmaticBackend.php", + "method": "rescheduleAppointment", + "observed_behavior": "QmaticBackend::rescheduleAppointment()" + }, + { + "file": "lib/Service/AppointmentService.php", + "method": "getTimeslots", + "observed_behavior": "AppointmentService::getTimeslots()" + }, + { + "file": "lib/Service/AppointmentService.php", + "method": "bookAppointment", + "observed_behavior": "AppointmentService::bookAppointment()" + }, + { + "file": "lib/Service/AppointmentService.php", + "method": "cancelAppointment", + "observed_behavior": "AppointmentService::cancelAppointment()" + }, + { + "file": "lib/Service/AppointmentService.php", + "method": "markNoShow", + "observed_behavior": "AppointmentService::markNoShow()" + }, + { + "file": "lib/Service/AppointmentService.php", + "method": "getAppointmentsForCase", + "observed_behavior": "AppointmentService::getAppointmentsForCase()" + }, + { + "file": "lib/Service/AppointmentService.php", + "method": "getAppointmentByToken", + "observed_behavior": "AppointmentService::getAppointmentByToken()" + }, + { + "file": "lib/Service/AppointmentService.php", + "method": "getBackend", + "observed_behavior": "AppointmentService::getBackend()" + }, + { + "file": "lib/Service/AppointmentService.php", + "method": "getObjectService", + "observed_behavior": "AppointmentService::getObjectService()" + }, + { + "file": "src/views/public/PublicAppointmentPage.vue", + "method": "formatDateTime", + "observed_behavior": "src/views/public/PublicAppointmentPage.vue::formatDateTime" + }, + { + "file": "src/views/public/PublicAppointmentPage.vue", + "method": "if", + "observed_behavior": "src/views/public/PublicAppointmentPage.vue::if" + }, + { + "file": "src/services/appointmentApi.js", + "method": "listAppointments", + "observed_behavior": "src/services/appointmentApi.js::listAppointments" + }, + { + "file": "src/services/appointmentApi.js", + "method": "bookAppointment", + "observed_behavior": "src/services/appointmentApi.js::bookAppointment" + }, + { + "file": "src/services/appointmentApi.js", + "method": "cancelAppointment", + "observed_behavior": "src/services/appointmentApi.js::cancelAppointment" + }, + { + "file": "src/services/appointmentApi.js", + "method": "markNoShow", + "observed_behavior": "src/services/appointmentApi.js::markNoShow" + }, + { + "file": "src/services/appointmentApi.js", + "method": "getTimeslots", + "observed_behavior": "src/services/appointmentApi.js::getTimeslots" + } + ], + "berichtenbox": [ + { + "file": "lib/BackgroundJob/BerichtenboxReadStatusJob.php", + "method": "run", + "observed_behavior": "BerichtenboxReadStatusJob::run()" + }, + { + "file": "lib/Controller/BerichtenboxController.php", + "method": "send", + "observed_behavior": "BerichtenboxController::send()" + }, + { + "file": "lib/Controller/BerichtenboxController.php", + "method": "messages", + "observed_behavior": "BerichtenboxController::messages()" + }, + { + "file": "lib/Controller/BerichtenboxController.php", + "method": "poll", + "observed_behavior": "BerichtenboxController::poll()" + }, + { + "file": "lib/Service/BerichtenboxAdapter/MockAdapter.php", + "method": "sendMessage", + "observed_behavior": "MockAdapter::sendMessage()" + }, + { + "file": "lib/Service/BerichtenboxAdapter/MockAdapter.php", + "method": "getReadStatus", + "observed_behavior": "MockAdapter::getReadStatus()" + }, + { + "file": "lib/Service/BerichtenboxService.php", + "method": "sendMessage", + "observed_behavior": "BerichtenboxService::sendMessage()" + }, + { + "file": "lib/Service/BerichtenboxService.php", + "method": "getMessagesForCase", + "observed_behavior": "BerichtenboxService::getMessagesForCase()" + }, + { + "file": "lib/Service/BerichtenboxService.php", + "method": "pollReadStatus", + "observed_behavior": "BerichtenboxService::pollReadStatus()" + }, + { + "file": "lib/Service/BerichtenboxService.php", + "method": "validateBsn", + "observed_behavior": "BerichtenboxService::validateBsn()" + }, + { + "file": "lib/Service/BerichtenboxService.php", + "method": "validateMessage", + "observed_behavior": "BerichtenboxService::validateMessage()" + }, + { + "file": "lib/Service/BerichtenboxService.php", + "method": "getAdapter", + "observed_behavior": "BerichtenboxService::getAdapter()" + }, + { + "file": "lib/Service/BerichtenboxService.php", + "method": "getObjectService", + "observed_behavior": "BerichtenboxService::getObjectService()" + }, + { + "file": "src/services/berichtenboxApi.js", + "method": "sendMessage", + "observed_behavior": "src/services/berichtenboxApi.js::sendMessage" + }, + { + "file": "src/services/berichtenboxApi.js", + "method": "listMessages", + "observed_behavior": "src/services/berichtenboxApi.js::listMessages" + }, + { + "file": "src/services/berichtenboxApi.js", + "method": "getTypeCodes", + "observed_behavior": "src/services/berichtenboxApi.js::getTypeCodes" + }, + { + "file": "src/services/berichtenboxApi.js", + "method": "pollReadStatus", + "observed_behavior": "src/services/berichtenboxApi.js::pollReadStatus" + } + ], + "case-sharing": [ + { + "file": "lib/BackgroundJob/ShareMaintenanceJob.php", + "method": "run", + "observed_behavior": "ShareMaintenanceJob::run()" + }, + { + "file": "lib/Controller/CaseSharingController.php", + "method": "listShares", + "observed_behavior": "CaseSharingController::listShares()" + }, + { + "file": "lib/Controller/CaseSharingController.php", + "method": "createShare", + "observed_behavior": "CaseSharingController::createShare()" + }, + { + "file": "lib/Controller/CaseSharingController.php", + "method": "revokeShare", + "observed_behavior": "CaseSharingController::revokeShare()" + }, + { + "file": "lib/Controller/CaseSharingController.php", + "method": "initiateTransfer", + "observed_behavior": "CaseSharingController::initiateTransfer()" + }, + { + "file": "lib/Controller/CaseSharingController.php", + "method": "handleTransfer", + "observed_behavior": "CaseSharingController::handleTransfer()" + }, + { + "file": "lib/Controller/PublicShareController.php", + "method": "accessShare", + "observed_behavior": "PublicShareController::accessShare()" + }, + { + "file": "lib/Controller/PublicShareController.php", + "method": "addComment", + "observed_behavior": "PublicShareController::addComment()" + }, + { + "file": "lib/Controller/PublicShareController.php", + "method": "viewStatus", + "observed_behavior": "PublicShareController::viewStatus()" + }, + { + "file": "lib/Controller/PublicShareController.php", + "method": "loadCaseData", + "observed_behavior": "PublicShareController::loadCaseData()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "generateToken", + "observed_behavior": "CaseSharingService::generateToken()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "createTokenShare", + "observed_behavior": "CaseSharingService::createTokenShare()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "createPartnerShare", + "observed_behavior": "CaseSharingService::createPartnerShare()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "getSharesByCase", + "observed_behavior": "CaseSharingService::getSharesByCase()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "revokeShare", + "observed_behavior": "CaseSharingService::revokeShare()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "validateToken", + "observed_behavior": "CaseSharingService::validateToken()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "getFilteredCaseData", + "observed_behavior": "CaseSharingService::getFilteredCaseData()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "maskBsn", + "observed_behavior": "CaseSharingService::maskBsn()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "recordFailedAttempt", + "observed_behavior": "CaseSharingService::recordFailedAttempt()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "resetFailedAttempts", + "observed_behavior": "CaseSharingService::resetFailedAttempts()" + }, + { + "file": "lib/Service/CaseSharingService.php", + "method": "getObjectService", + "observed_behavior": "CaseSharingService::getObjectService()" + }, + { + "file": "lib/Service/CaseTransferService.php", + "method": "initiateTransfer", + "observed_behavior": "CaseTransferService::initiateTransfer()" + }, + { + "file": "lib/Service/CaseTransferService.php", + "method": "acceptTransfer", + "observed_behavior": "CaseTransferService::acceptTransfer()" + }, + { + "file": "lib/Service/CaseTransferService.php", + "method": "rejectTransfer", + "observed_behavior": "CaseTransferService::rejectTransfer()" + }, + { + "file": "lib/Service/CaseTransferService.php", + "method": "getObjectService", + "observed_behavior": "CaseTransferService::getObjectService()" + }, + { + "file": "src/views/public/PublicCaseView.vue", + "method": "loadShareData", + "observed_behavior": "src/views/public/PublicCaseView.vue::loadShareData" + }, + { + "file": "src/views/public/PublicCaseView.vue", + "method": "if", + "observed_behavior": "src/views/public/PublicCaseView.vue::if" + }, + { + "file": "src/views/public/PublicStatusPage.vue", + "method": "loadStatus", + "observed_behavior": "src/views/public/PublicStatusPage.vue::loadStatus" + }, + { + "file": "src/views/public/PublicStatusPage.vue", + "method": "if", + "observed_behavior": "src/views/public/PublicStatusPage.vue::if" + } + ], + "ai-assistant": [ + { + "file": "lib/Controller/AiController.php", + "method": "classify", + "observed_behavior": "AiController::classify()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "extract", + "observed_behavior": "AiController::extract()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "ask", + "observed_behavior": "AiController::ask()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "summarize", + "observed_behavior": "AiController::summarize()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "suggestRouting", + "observed_behavior": "AiController::suggestRouting()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "suggestNext", + "observed_behavior": "AiController::suggestNext()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "recordAction", + "observed_behavior": "AiController::recordAction()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "auditIndex", + "observed_behavior": "AiController::auditIndex()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "getSettings", + "observed_behavior": "AiController::getSettings()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "updateSettings", + "observed_behavior": "AiController::updateSettings()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "healthCheck", + "observed_behavior": "AiController::healthCheck()" + }, + { + "file": "lib/Controller/AiController.php", + "method": "getCurrentUserId", + "observed_behavior": "AiController::getCurrentUserId()" + }, + { + "file": "lib/Service/AiService.php", + "method": "isEnabled", + "observed_behavior": "AiService::isEnabled()" + }, + { + "file": "lib/Service/AiService.php", + "method": "isFeatureEnabled", + "observed_behavior": "AiService::isFeatureEnabled()" + }, + { + "file": "lib/Service/AiService.php", + "method": "classifyDocument", + "observed_behavior": "AiService::classifyDocument()" + }, + { + "file": "lib/Service/AiService.php", + "method": "extractData", + "observed_behavior": "AiService::extractData()" + }, + { + "file": "lib/Service/AiService.php", + "method": "askQuestion", + "observed_behavior": "AiService::askQuestion()" + }, + { + "file": "lib/Service/AiService.php", + "method": "summarize", + "observed_behavior": "AiService::summarize()" + }, + { + "file": "lib/Service/AiService.php", + "method": "suggestRouting", + "observed_behavior": "AiService::suggestRouting()" + }, + { + "file": "lib/Service/AiService.php", + "method": "suggestNextStep", + "observed_behavior": "AiService::suggestNextStep()" + }, + { + "file": "lib/Service/AiService.php", + "method": "recordUserAction", + "observed_behavior": "AiService::recordUserAction()" + }, + { + "file": "lib/Service/AiService.php", + "method": "testHealth", + "observed_behavior": "AiService::testHealth()" + }, + { + "file": "lib/Service/AiService.php", + "method": "getAiSettings", + "observed_behavior": "AiService::getAiSettings()" + }, + { + "file": "lib/Service/AiService.php", + "method": "getModelIdentifier", + "observed_behavior": "AiService::getModelIdentifier()" + }, + { + "file": "lib/Service/AiService.php", + "method": "stripPiiIfEnabled", + "observed_behavior": "AiService::stripPiiIfEnabled()" + }, + { + "file": "lib/Service/AiService.php", + "method": "callAiModel", + "observed_behavior": "AiService::callAiModel()" + }, + { + "file": "lib/Service/AiService.php", + "method": "recordAuditEntry", + "observed_behavior": "AiService::recordAuditEntry()" + }, + { + "file": "lib/Service/AiService.php", + "method": "buildClassificationPrompt", + "observed_behavior": "AiService::buildClassificationPrompt()" + }, + { + "file": "lib/Service/AiService.php", + "method": "buildExtractionPrompt", + "observed_behavior": "AiService::buildExtractionPrompt()" + }, + { + "file": "lib/Service/AiService.php", + "method": "buildQaPrompt", + "observed_behavior": "AiService::buildQaPrompt()" + }, + { + "file": "lib/Service/AiService.php", + "method": "buildSummaryPrompt", + "observed_behavior": "AiService::buildSummaryPrompt()" + }, + { + "file": "lib/Service/AiService.php", + "method": "buildRoutingPrompt", + "observed_behavior": "AiService::buildRoutingPrompt()" + }, + { + "file": "lib/Service/AiService.php", + "method": "buildNextStepPrompt", + "observed_behavior": "AiService::buildNextStepPrompt()" + }, + { + "file": "src/services/aiApi.js", + "method": "classifyDocument", + "observed_behavior": "src/services/aiApi.js::classifyDocument" + }, + { + "file": "src/services/aiApi.js", + "method": "extractData", + "observed_behavior": "src/services/aiApi.js::extractData" + }, + { + "file": "src/services/aiApi.js", + "method": "askQuestion", + "observed_behavior": "src/services/aiApi.js::askQuestion" + }, + { + "file": "src/services/aiApi.js", + "method": "summarize", + "observed_behavior": "src/services/aiApi.js::summarize" + }, + { + "file": "src/services/aiApi.js", + "method": "suggestRouting", + "observed_behavior": "src/services/aiApi.js::suggestRouting" + }, + { + "file": "src/services/aiApi.js", + "method": "suggestNext", + "observed_behavior": "src/services/aiApi.js::suggestNext" + }, + { + "file": "src/services/aiApi.js", + "method": "getAuditLog", + "observed_behavior": "src/services/aiApi.js::getAuditLog" + }, + { + "file": "src/services/aiApi.js", + "method": "getAiSettings", + "observed_behavior": "src/services/aiApi.js::getAiSettings" + }, + { + "file": "src/services/aiApi.js", + "method": "updateAiSettings", + "observed_behavior": "src/services/aiApi.js::updateAiSettings" + }, + { + "file": "src/services/aiApi.js", + "method": "testAiHealth", + "observed_behavior": "src/services/aiApi.js::testAiHealth" + } + ], + "leges": [ + { + "file": "lib/Controller/LegesController.php", + "method": "calculate", + "observed_behavior": "LegesController::calculate()" + }, + { + "file": "lib/Controller/LegesController.php", + "method": "recalculate", + "observed_behavior": "LegesController::recalculate()" + }, + { + "file": "lib/Controller/LegesController.php", + "method": "verrekening", + "observed_behavior": "LegesController::verrekening()" + }, + { + "file": "lib/Controller/LegesController.php", + "method": "teruggaaf", + "observed_behavior": "LegesController::teruggaaf()" + }, + { + "file": "lib/Controller/LegesController.php", + "method": "export", + "observed_behavior": "LegesController::export()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "calculate", + "observed_behavior": "LegesCalculationService::calculate()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "recalculate", + "observed_behavior": "LegesCalculationService::recalculate()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "calculateVerrekening", + "observed_behavior": "LegesCalculationService::calculateVerrekening()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "calculateTeruggaaf", + "observed_behavior": "LegesCalculationService::calculateTeruggaaf()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "calculateArtikel", + "observed_behavior": "LegesCalculationService::calculateArtikel()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "calculateVast", + "observed_behavior": "LegesCalculationService::calculateVast()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "calculatePercentage", + "observed_behavior": "LegesCalculationService::calculatePercentage()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "calculateStaffel", + "observed_behavior": "LegesCalculationService::calculateStaffel()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "calculateMaximum", + "observed_behavior": "LegesCalculationService::calculateMaximum()" + }, + { + "file": "lib/Service/LegesCalculationService.php", + "method": "calculateCombinatie", + "observed_behavior": "LegesCalculationService::calculateCombinatie()" + }, + { + "file": "lib/Service/LegesExportService.php", + "method": "export", + "observed_behavior": "LegesExportService::export()" + }, + { + "file": "lib/Service/LegesExportService.php", + "method": "exportCSV", + "observed_behavior": "LegesExportService::exportCSV()" + }, + { + "file": "lib/Service/LegesExportService.php", + "method": "exportASCII", + "observed_behavior": "LegesExportService::exportASCII()" + }, + { + "file": "lib/Service/LegesExportService.php", + "method": "exportXML", + "observed_behavior": "LegesExportService::exportXML()" + }, + { + "file": "lib/Service/LegesExportService.php", + "method": "flattenBerekening", + "observed_behavior": "LegesExportService::flattenBerekening()" + }, + { + "file": "lib/Service/LegesExportService.php", + "method": "addXmlElement", + "observed_behavior": "LegesExportService::addXmlElement()" + } + ], + "stuf-protocol": [ + { + "file": "lib/Controller/StufController.php", + "method": "zaken", + "observed_behavior": "StufController::zaken()" + }, + { + "file": "lib/Controller/StufController.php", + "method": "personen", + "observed_behavior": "StufController::personen()" + }, + { + "file": "lib/Controller/StufController.php", + "method": "handleSoapMessage", + "observed_behavior": "StufController::handleSoapMessage()" + }, + { + "file": "lib/Controller/StufController.php", + "method": "handleZakLk01", + "observed_behavior": "StufController::handleZakLk01()" + }, + { + "file": "lib/Controller/StufController.php", + "method": "handleZakLv01", + "observed_behavior": "StufController::handleZakLv01()" + }, + { + "file": "lib/Controller/StufController.php", + "method": "handleNpsLv01", + "observed_behavior": "StufController::handleNpsLv01()" + }, + { + "file": "lib/Controller/StufController.php", + "method": "handleEdcLk01", + "observed_behavior": "StufController::handleEdcLk01()" + }, + { + "file": "lib/Controller/StufController.php", + "method": "handleUnknownMessage", + "observed_behavior": "StufController::handleUnknownMessage()" + }, + { + "file": "lib/Controller/StufController.php", + "method": "extractFields", + "observed_behavior": "StufController::extractFields()" + }, + { + "file": "lib/Controller/StufController.php", + "method": "soapResponse", + "observed_behavior": "StufController::soapResponse()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "mapZknToInternal", + "observed_behavior": "StufFieldMappingService::mapZknToInternal()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "mapInternalToZkn", + "observed_behavior": "StufFieldMappingService::mapInternalToZkn()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "mapBgToInternal", + "observed_behavior": "StufFieldMappingService::mapBgToInternal()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "mapInternalToBg", + "observed_behavior": "StufFieldMappingService::mapInternalToBg()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "stufDateToIso", + "observed_behavior": "StufFieldMappingService::stufDateToIso()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "isoToStufDate", + "observed_behavior": "StufFieldMappingService::isoToStufDate()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "isoToStufDateTime", + "observed_behavior": "StufFieldMappingService::isoToStufDateTime()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "confidentialityToInternal", + "observed_behavior": "StufFieldMappingService::confidentialityToInternal()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "confidentialityToStuf", + "observed_behavior": "StufFieldMappingService::confidentialityToStuf()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "addCustomMappings", + "observed_behavior": "StufFieldMappingService::addCustomMappings()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "getDefaultMappings", + "observed_behavior": "StufFieldMappingService::getDefaultMappings()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "applyMappings", + "observed_behavior": "StufFieldMappingService::applyMappings()" + }, + { + "file": "lib/Service/StufFieldMappingService.php", + "method": "applyReverseMappings", + "observed_behavior": "StufFieldMappingService::applyReverseMappings()" + }, + { + "file": "lib/Service/StufMessageBuilder.php", + "method": "buildSoapEnvelope", + "observed_behavior": "StufMessageBuilder::buildSoapEnvelope()" + }, + { + "file": "lib/Service/StufMessageBuilder.php", + "method": "buildStuurgegevens", + "observed_behavior": "StufMessageBuilder::buildStuurgegevens()" + }, + { + "file": "lib/Service/StufMessageBuilder.php", + "method": "buildBv01", + "observed_behavior": "StufMessageBuilder::buildBv01()" + }, + { + "file": "lib/Service/StufMessageBuilder.php", + "method": "buildFo01", + "observed_behavior": "StufMessageBuilder::buildFo01()" + }, + { + "file": "lib/Service/StufMessageBuilder.php", + "method": "buildSoapFault", + "observed_behavior": "StufMessageBuilder::buildSoapFault()" + }, + { + "file": "lib/Service/StufMessageBuilder.php", + "method": "generateUuid", + "observed_behavior": "StufMessageBuilder::generateUuid()" + } + ], + "templates": [ + { + "file": "lib/Controller/TemplateController.php", + "method": "index", + "observed_behavior": "TemplateController::index()" + }, + { + "file": "lib/Controller/TemplateController.php", + "method": "show", + "observed_behavior": "TemplateController::show()" + }, + { + "file": "lib/Controller/TemplateController.php", + "method": "activate", + "observed_behavior": "TemplateController::activate()" + }, + { + "file": "lib/Service/TemplateLibraryService.php", + "method": "listTemplates", + "observed_behavior": "TemplateLibraryService::listTemplates()" + }, + { + "file": "lib/Service/TemplateLibraryService.php", + "method": "loadTemplate", + "observed_behavior": "TemplateLibraryService::loadTemplate()" + }, + { + "file": "lib/Service/TemplateLibraryService.php", + "method": "activateTemplate", + "observed_behavior": "TemplateLibraryService::activateTemplate()" + } + ], + "multi-tenancy": [ + { + "file": "lib/Controller/TenantController.php", + "method": "index", + "observed_behavior": "TenantController::index()" + }, + { + "file": "lib/Controller/TenantController.php", + "method": "create", + "observed_behavior": "TenantController::create()" + }, + { + "file": "lib/Controller/TenantController.php", + "method": "provision", + "observed_behavior": "TenantController::provision()" + }, + { + "file": "lib/Controller/TenantController.php", + "method": "usage", + "observed_behavior": "TenantController::usage()" + }, + { + "file": "lib/Controller/TenantController.php", + "method": "current", + "observed_behavior": "TenantController::current()" + }, + { + "file": "lib/Controller/TenantController.php", + "method": "isPlatformAdmin", + "observed_behavior": "TenantController::isPlatformAdmin()" + }, + { + "file": "lib/Middleware/TenantMiddleware.php", + "method": "beforeController", + "observed_behavior": "TenantMiddleware::beforeController()" + }, + { + "file": "lib/Middleware/TenantMiddleware.php", + "method": "afterException", + "observed_behavior": "TenantMiddleware::afterException()" + }, + { + "file": "lib/Service/TenantService.php", + "method": "getTenantForUser", + "observed_behavior": "TenantService::getTenantForUser()" + }, + { + "file": "lib/Service/TenantService.php", + "method": "getTenantByGroupId", + "observed_behavior": "TenantService::getTenantByGroupId()" + }, + { + "file": "lib/Service/TenantService.php", + "method": "createTenant", + "observed_behavior": "TenantService::createTenant()" + }, + { + "file": "lib/Service/TenantService.php", + "method": "provisionTenant", + "observed_behavior": "TenantService::provisionTenant()" + }, + { + "file": "lib/Service/TenantService.php", + "method": "getResourceUsage", + "observed_behavior": "TenantService::getResourceUsage()" + }, + { + "file": "lib/Service/TenantService.php", + "method": "isUserInTenant", + "observed_behavior": "TenantService::isUserInTenant()" + }, + { + "file": "lib/Service/TenantService.php", + "method": "isPlatformAdmin", + "observed_behavior": "TenantService::isPlatformAdmin()" + }, + { + "file": "lib/Service/TenantService.php", + "method": "slugify", + "observed_behavior": "TenantService::slugify()" + }, + { + "file": "lib/Service/TenantService.php", + "method": "getObjectService", + "observed_behavior": "TenantService::getObjectService()" + }, + { + "file": "src/services/tenantApi.js", + "method": "listTenants", + "observed_behavior": "src/services/tenantApi.js::listTenants" + }, + { + "file": "src/services/tenantApi.js", + "method": "createTenant", + "observed_behavior": "src/services/tenantApi.js::createTenant" + }, + { + "file": "src/services/tenantApi.js", + "method": "getTenant", + "observed_behavior": "src/services/tenantApi.js::getTenant" + }, + { + "file": "src/services/tenantApi.js", + "method": "updateTenant", + "observed_behavior": "src/services/tenantApi.js::updateTenant" + }, + { + "file": "src/services/tenantApi.js", + "method": "provisionTenant", + "observed_behavior": "src/services/tenantApi.js::provisionTenant" + }, + { + "file": "src/services/tenantApi.js", + "method": "getTenantUsage", + "observed_behavior": "src/services/tenantApi.js::getTenantUsage" + }, + { + "file": "src/services/tenantApi.js", + "method": "getCurrentTenant", + "observed_behavior": "src/services/tenantApi.js::getCurrentTenant" + } + ], + "dso-intake": [ + { + "file": "lib/Service/DsoIntakeService.php", + "method": "processAanvraag", + "observed_behavior": "DsoIntakeService::processAanvraag()" + }, + { + "file": "lib/Service/DsoIntakeService.php", + "method": "getDeadlineDuration", + "observed_behavior": "DsoIntakeService::getDeadlineDuration()" + } + ] + }, + "bucket_3a": [], + "bucket_3b": [ + { + "req": "advice-management#REQ-001", + "title": "Advice request schema" + }, + { + "req": "advice-management#REQ-002", + "title": "Advice panel on case dashboard" + }, + { + "req": "advice-management#REQ-003", + "title": "Advice request form" + }, + { + "req": "automatic-actions#REQ-001", + "title": "Automatic Action Framework" + }, + { + "req": "automatic-actions#REQ-002", + "title": "Action Execution Error Handling" + }, + { + "req": "beroep-escalation#REQ-001", + "title": "Beroep Case Type Pre-Seeded Configuration" + }, + { + "req": "beroep-escalation#REQ-002", + "title": "Beroep Status Types" + }, + { + "req": "beroep-escalation#REQ-003", + "title": "Escalation from Bezwaar to Beroep" + }, + { + "req": "beroep-escalation#REQ-004", + "title": "Court Proceedings Document Management" + }, + { + "req": "beroep-escalation#REQ-005", + "title": "Hoger Beroep Awareness" + }, + { + "req": "bezwaar-advisory-committee#REQ-001", + "title": "Advisory Committee Report Schema" + }, + { + "req": "bezwaar-advisory-committee#REQ-002", + "title": "Committee Composition Tracking" + }, + { + "req": "bezwaar-decision#REQ-001", + "title": "Decision on Objection Schema" + }, + { + "req": "bezwaar-decision#REQ-002", + "title": "Decision Notification" + }, + { + "req": "bezwaar-decision#REQ-003", + "title": "Heroverweging (Full Reconsideration)" + }, + { + "req": "bezwaar-hearing#REQ-001", + "title": "Hearing Session Management" + }, + { + "req": "bezwaar-hearing#REQ-002", + "title": "Hearing Waiver (Afzien van Hoorrecht)" + }, + { + "req": "bezwaar-hearing#REQ-003", + "title": "Hearing Participants and Access Rights" + }, + { + "req": "case-location#REQ-LOC-01", + "title": "Case Detail Map Tab" + }, + { + "req": "case-location#REQ-LOC-02", + "title": "Location Picker" + }, + { + "req": "case-location#REQ-LOC-03", + "title": "Address Display and Reverse Geocoding" + }, + { + "req": "case-location#REQ-LOC-04", + "title": "Case Creation Location" + }, + { + "req": "deelzaak-support#REQ-001", + "title": "Sub-case creation from parent case" + }, + { + "req": "deelzaak-support#REQ-002", + "title": "Sub-cases section on parent case detail" + }, + { + "req": "deelzaak-support#REQ-003", + "title": "Parent case breadcrumb navigation" + }, + { + "req": "deelzaak-support#REQ-004", + "title": "Sub-case progress roll-up on parent case" + }, + { + "req": "deelzaak-support#REQ-005", + "title": "Sub-case count in case list" + }, + { + "req": "deelzaak-support#REQ-006", + "title": "Sub-case deletion protection" + }, + { + "req": "enforcement-lhs#REQ-001", + "title": "LHS matrix configuration" + }, + { + "req": "enforcement-lhs#REQ-002", + "title": "Enforcement action schema" + }, + { + "req": "enforcement-lhs#REQ-003", + "title": "Enforcement wizard" + }, + { + "req": "enforcement-lhs#REQ-004", + "title": "Enforcement panel on case dashboard" + }, + { + "req": "parafering-dashboard#REQ-001", + "title": "Secretariaat Parafering Overview" + }, + { + "req": "parafering-dashboard#REQ-002", + "title": "Personal Parafering Inbox" + }, + { + "req": "parafering-dashboard#REQ-003", + "title": "Send Parafering Reminder" + }, + { + "req": "parafering-dashboard#REQ-004", + "title": "Voorstel List Navigation" + }, + { + "req": "process-step-configuration#REQ-001", + "title": "Process Step CRUD within Workflow" + }, + { + "req": "process-step-configuration#REQ-002", + "title": "Step-to-Task Mapping at Runtime" + }, + { + "req": "procest-case-management#REQ-001", + "title": "1: Register and schemas MUST be auto-configured on install" + }, + { + "req": "procest-case-management#REQ-002", + "title": "2: Cases list view MUST display paginated, searchable case overview" + }, + { + "req": "procest-case-management#REQ-003", + "title": "3: Case create dialog MUST support type-driven case creation" + }, + { + "req": "procest-case-management#REQ-004", + "title": "4: Case detail view MUST display full case information with related data" + }, + { + "req": "procest-case-management#REQ-005", + "title": "5: Status lifecycle MUST support configurable status flows with mandatory result on closure" + }, + { + "req": "procest-case-management#REQ-006", + "title": "6: Deadline and timing MUST support processing deadlines with extensions" + }, + { + "req": "procest-case-management#REQ-007", + "title": "7: Tasks MUST be manageable within case context" + }, + { + "req": "procest-case-management#REQ-008", + "title": "8: Participants MUST be manageable per case" + }, + { + "req": "procest-case-management#REQ-009", + "title": "9: Activity timeline MUST record all case events" + }, + { + "req": "procest-case-management#REQ-010", + "title": "10: Case type administration MUST support configuring case types" + }, + { + "req": "procest-case-management#REQ-011", + "title": "11: Navigation MUST include all primary views" + }, + { + "req": "procest-case-management#REQ-012", + "title": "12: Dashboard MUST provide overview metrics and quick access" + }, + { + "req": "procest-case-management#REQ-013", + "title": "13: ZGW API compatibility MUST be maintained" + }, + { + "req": "role-based-step-routing#REQ-001", + "title": "Role-Based Step Visibility" + }, + { + "req": "role-based-step-routing#REQ-002", + "title": "Role-Based Transition Access" + }, + { + "req": "role-based-step-routing#REQ-003", + "title": "Workflow Inheritance for Role Configuration" + }, + { + "req": "status-transition-engine#REQ-001", + "title": "Guard Evaluation Engine" + }, + { + "req": "status-transition-engine#REQ-002", + "title": "Transition Execution" + }, + { + "req": "status-transition-engine#REQ-003", + "title": "Available Transitions for Current User" + }, + { + "req": "visual-workflow-editor#REQ-001", + "title": "Drag-and-Drop Workflow Canvas" + }, + { + "req": "visual-workflow-editor#REQ-002", + "title": "Workflow Editor Validation" + }, + { + "req": "visual-workflow-editor#REQ-003", + "title": "Step Configuration Panel" + }, + { + "req": "vth-workflow-templates#REQ-001", + "title": "Omgevingsvergunning workflow template" + }, + { + "req": "vth-workflow-templates#REQ-002", + "title": "Toezichtzaak workflow template" + }, + { + "req": "vth-workflow-templates#REQ-003", + "title": "Handhavingszaak workflow template" + }, + { + "req": "vth-workflow-templates#REQ-004", + "title": "VTH workflow template library" + }, + { + "req": "workflow-definition-model#REQ-001", + "title": "Workflow Template Data Model" + }, + { + "req": "workflow-definition-model#REQ-002", + "title": "Workflow Step Data Model" + }, + { + "req": "workflow-definition-model#REQ-003", + "title": "Status Transition Data Model" + }, + { + "req": "workflow-definition-model#REQ-004", + "title": "Pre-Seeded Bezwaar Workflow Template" + }, + { + "req": "workflow-definition-model#REQ-005", + "title": "Pre-Seeded Beroep Workflow Template" + }, + { + "req": "workflow-import-export#REQ-001", + "title": "Export Workflow Template" + }, + { + "req": "workflow-import-export#REQ-002", + "title": "Import Workflow Template" + }, + { + "req": "zaaktype-versioning#REQ-001", + "title": "Workflow Template Versioning" + }, + { + "req": "zaaktype-versioning#REQ-002", + "title": "Case-to-Workflow-Version Binding" + } + ], + "bucket_4": { + "missing-license-in-file-docblock": [ + { + "file": "lib/BackgroundJob/AppointmentReminderJob.php" + }, + { + "file": "lib/BackgroundJob/BerichtenboxReadStatusJob.php" + }, + { + "file": "lib/Controller/AppointmentController.php" + }, + { + "file": "lib/Controller/BerichtenboxController.php" + }, + { + "file": "lib/Controller/PublicAppointmentController.php" + }, + { + "file": "lib/Service/AppointmentBackend/AppointmentBackendInterface.php" + }, + { + "file": "lib/Service/AppointmentBackend/JccBackend.php" + }, + { + "file": "lib/Service/AppointmentBackend/LocalBackend.php" + }, + { + "file": "lib/Service/AppointmentBackend/QmaticBackend.php" + }, + { + "file": "lib/Service/AppointmentService.php" + }, + { + "file": "lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php" + }, + { + "file": "lib/Service/BerichtenboxAdapter/MockAdapter.php" + }, + { + "file": "lib/Service/BerichtenboxService.php" + } + ], + "missing-copyright-in-file-docblock": [ + { + "file": "lib/BackgroundJob/AppointmentReminderJob.php" + }, + { + "file": "lib/BackgroundJob/BerichtenboxReadStatusJob.php" + }, + { + "file": "lib/Controller/AppointmentController.php" + }, + { + "file": "lib/Controller/BerichtenboxController.php" + }, + { + "file": "lib/Controller/PublicAppointmentController.php" + }, + { + "file": "lib/Service/AppointmentBackend/AppointmentBackendInterface.php" + }, + { + "file": "lib/Service/AppointmentBackend/JccBackend.php" + }, + { + "file": "lib/Service/AppointmentBackend/LocalBackend.php" + }, + { + "file": "lib/Service/AppointmentBackend/QmaticBackend.php" + }, + { + "file": "lib/Service/AppointmentService.php" + }, + { + "file": "lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php" + }, + { + "file": "lib/Service/BerichtenboxAdapter/MockAdapter.php" + }, + { + "file": "lib/Service/BerichtenboxService.php" + } + ], + "missing-spec-in-file-docblock": [ + { + "file": "lib/AppInfo/Application.php" + }, + { + "file": "lib/BackgroundJob/AppointmentReminderJob.php" + }, + { + "file": "lib/BackgroundJob/BerichtenboxReadStatusJob.php" + }, + { + "file": "lib/BackgroundJob/ShareMaintenanceJob.php" + }, + { + "file": "lib/Controller/AcController.php" + }, + { + "file": "lib/Controller/AiController.php" + }, + { + "file": "lib/Controller/AppointmentController.php" + }, + { + "file": "lib/Controller/BerichtenboxController.php" + }, + { + "file": "lib/Controller/BrcController.php" + }, + { + "file": "lib/Controller/CaseDefinitionController.php" + }, + { + "file": "lib/Controller/CaseSharingController.php" + }, + { + "file": "lib/Controller/ConsultationController.php" + }, + { + "file": "lib/Controller/DashboardController.php" + }, + { + "file": "lib/Controller/DrcController.php" + }, + { + "file": "lib/Controller/EmailController.php" + }, + { + "file": "lib/Controller/GisProxyController.php" + }, + { + "file": "lib/Controller/HealthController.php" + }, + { + "file": "lib/Controller/InspectionController.php" + }, + { + "file": "lib/Controller/LegesController.php" + }, + { + "file": "lib/Controller/MetricsController.php" + }, + { + "file": "lib/Controller/MilestoneController.php" + }, + { + "file": "lib/Controller/NrcController.php" + }, + { + "file": "lib/Controller/ParaferingController.php" + }, + { + "file": "lib/Controller/PublicAppointmentController.php" + }, + { + "file": "lib/Controller/PublicShareController.php" + }, + { + "file": "lib/Controller/SettingsController.php" + }, + { + "file": "lib/Controller/StufController.php" + }, + { + "file": "lib/Controller/TemplateController.php" + }, + { + "file": "lib/Controller/TenantController.php" + }, + { + "file": "lib/Controller/ZgwMappingController.php" + }, + { + "file": "lib/Controller/ZrcController.php" + }, + { + "file": "lib/Controller/ZtcController.php" + }, + { + "file": "lib/Dashboard/CasesOverviewWidget.php" + }, + { + "file": "lib/Dashboard/DeadlineAlertsWidget.php" + }, + { + "file": "lib/Dashboard/MyTasksWidget.php" + }, + { + "file": "lib/Dashboard/OverdueCasesWidget.php" + }, + { + "file": "lib/Dashboard/StalledCasesWidget.php" + }, + { + "file": "lib/Dashboard/StartCaseWidget.php" + }, + { + "file": "lib/Dashboard/TaskRemindersWidget.php" + }, + { + "file": "lib/Listener/DeepLinkRegistrationListener.php" + }, + { + "file": "lib/Middleware/TenantMiddleware.php" + }, + { + "file": "lib/Middleware/ZgwAuthException.php" + }, + { + "file": "lib/Middleware/ZgwAuthMiddleware.php" + }, + { + "file": "lib/Repair/InitializeSettings.php" + }, + { + "file": "lib/Repair/LoadDefaultZgwMappings.php" + }, + { + "file": "lib/Repair/SeedBezwaarBeroepData.php" + }, + { + "file": "lib/Sections/SettingsSection.php" + }, + { + "file": "lib/Service/AiService.php" + }, + { + "file": "lib/Service/AppointmentBackend/AppointmentBackendInterface.php" + }, + { + "file": "lib/Service/AppointmentBackend/JccBackend.php" + }, + { + "file": "lib/Service/AppointmentBackend/LocalBackend.php" + }, + { + "file": "lib/Service/AppointmentBackend/QmaticBackend.php" + }, + { + "file": "lib/Service/AppointmentService.php" + }, + { + "file": "lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php" + }, + { + "file": "lib/Service/BerichtenboxAdapter/MockAdapter.php" + }, + { + "file": "lib/Service/BerichtenboxService.php" + }, + { + "file": "lib/Service/CaseDefinitionExportService.php" + }, + { + "file": "lib/Service/CaseDefinitionImportService.php" + }, + { + "file": "lib/Service/CaseEmailService.php" + }, + { + "file": "lib/Service/CaseSharingService.php" + }, + { + "file": "lib/Service/CaseTransferService.php" + }, + { + "file": "lib/Service/ChecklistService.php" + }, + { + "file": "lib/Service/ConsultationService.php" + }, + { + "file": "lib/Service/DsoIntakeService.php" + }, + { + "file": "lib/Service/GisProxyService.php" + }, + { + "file": "lib/Service/InspectionService.php" + }, + { + "file": "lib/Service/LegesCalculationService.php" + }, + { + "file": "lib/Service/LegesExportService.php" + }, + { + "file": "lib/Service/MilestoneService.php" + }, + { + "file": "lib/Service/NotificatieService.php" + }, + { + "file": "lib/Service/ParaferingNotificationService.php" + }, + { + "file": "lib/Service/ParaferingService.php" + }, + { + "file": "lib/Service/SeedDataService.php" + }, + { + "file": "lib/Service/SettingsService.php" + }, + { + "file": "lib/Service/StufFieldMappingService.php" + }, + { + "file": "lib/Service/StufMessageBuilder.php" + }, + { + "file": "lib/Service/TemplateLibraryService.php" + }, + { + "file": "lib/Service/TenantService.php" + }, + { + "file": "lib/Service/ZgwBrcRulesService.php" + }, + { + "file": "lib/Service/ZgwBusinessRulesService.php" + }, + { + "file": "lib/Service/ZgwDocumentService.php" + }, + { + "file": "lib/Service/ZgwDrcRulesService.php" + }, + { + "file": "lib/Service/ZgwMappingService.php" + }, + { + "file": "lib/Service/ZgwPaginationHelper.php" + }, + { + "file": "lib/Service/ZgwRulesBase.php" + }, + { + "file": "lib/Service/ZgwService.php" + }, + { + "file": "lib/Service/ZgwZrcRulesService.php" + }, + { + "file": "lib/Service/ZgwZtcRulesService.php" + }, + { + "file": "lib/Settings/AdminSettings.php" + } + ], + "forbidden-patterns": [], + "direct-sql": [] + } + }, + "ignored": 0, + "notes": [ + "case-management/spec.md has duplicated REQ blocks (pilot noted lines 63-945 vs 1013-1946). Pre-retrofit cleanup recommended; counted 45 REQ headings but ~22 are unique.", + "Frontend (Vue/TS) classification is file-level \u2014 every method in a mapped view inherits the capability's first REQ with confidence 0.78 NEEDS-REVIEW. Specific REQ per method requires reading the component body during /opsx-annotate.", + "Large ZGW controllers and rules services (ZrcController 39 methods, ZgwService 37, ZgwZrcRulesService 19) are bucketed via explicit file-level overrides to zgw-api-mapping / zgw-business-rules-compliance. Per-method REQ assignment deferred to annotate.", + "Bucket 2b cluster 'workflow-import-export' is tentative \u2014 a workflow-import-export spec exists (2 REQs) but my classifier kept CaseDefinition* files in 2a until human confirms scope overlap.", + "zgw-business-rules-compliance spec only covers ZRC rules (11 REQs). Methods in ZgwDrcRulesService, ZgwZtcRulesService, ZgwBrcRulesService landed in Bucket 2a \u2014 they extend the capability but have no matching REQ in the spec.", + "Bucket 3b is computed conservatively: only REQs in capabilities that have ZERO Bucket 1 methods are marked unimplemented. REQs in 'touched' capabilities (admin-settings, case-management, etc.) are assumed implemented but not precisely mapped \u2014 their specific REQ-to-method assignment is deferred to /opsx-annotate.", + "3a classification disabled \u2014 git log -S heuristic was unreliable on this greenfield-over-specs codebase; every untouched REQ collapsed to 3b with a note." + ] +} \ No newline at end of file diff --git a/openspec/coverage-report.md b/openspec/coverage-report.md new file mode 100644 index 00000000..551acacf --- /dev/null +++ b/openspec/coverage-report.md @@ -0,0 +1,1224 @@ +# Coverage Report — procest + +Generated: 2026-04-20 08:44 UTC +Branch: `fix/header-info-email-phpcs` +Scanner: opsx-coverage-scan v1 (full per-method pass) + +Supersedes the file-level `coverage-report.pilot.{md,json}` from the 2026-04-20 pilot run. + +## Scope + +- PHP: 89 files under `lib/` scanned (764 methods, excluding Migration/ and Db/ entity boilerplate) +- Frontend: 183 files under `src/` scanned (318 units — Vue component methods + TS/JS functions) +- 331 REQs across 46 capabilities (354 heading hits; 23 dup/synth collapsed) +- `.opsx-ignore` not present — 0 entries suppressed + +## Summary + +| Bucket | Count | Next action | +|---|---|---| +| annotated | 0 | — (already tagged — none: procest is fully legacy) | +| plumbing | 102 (PHP: 102, FE: 0) | — (never tagged) | +| 1 — REQ matched | 678 (PHP: 392, FE: 286) | `/opsx-annotate procest` | +| 2a — existing capability, no REQ | 96 (7 clusters) | `/opsx-reverse-spec procest --extend ` | +| 2b — no capability owner | 206 (9 clusters) | `/opsx-reverse-spec procest --cluster ` | +| 3a — REQ broken (code removed) | 0 | (heuristic disabled — see notes) | +| 3b — REQ never implemented | 73 | Mark deferred or remove | +| 4 — ADR conformance | 115 findings across 3 rules | Follow-up issue | + +> **Large Bucket 1 (678 methods)** — consider annotating one capability at a time when `/opsx-annotate` gains `--capability` support. For now, annotate-all will produce a single large ghost change. + +## Bucket 1 — Ready to annotate + +Will be annotated via ghost change `retrofit-annotate-procest-2026-04-20`. Grouped by capability → file. + +### capability: admin-settings — 54 methods across 33 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Sections/SettingsSection.php` | `__construct()` | REQ-ADMIN-001 | 0.95 | explicit: IIconSection implementation | +| `lib/Sections/SettingsSection.php` | `getID()` | REQ-ADMIN-001 | 0.95 | explicit: IIconSection implementation | +| `lib/Sections/SettingsSection.php` | `getName()` | REQ-ADMIN-001 | 0.95 | explicit: IIconSection implementation | +| `lib/Sections/SettingsSection.php` | `getPriority()` | REQ-ADMIN-001 | 0.95 | explicit: IIconSection implementation | +| `lib/Sections/SettingsSection.php` | `getIcon()` | REQ-ADMIN-001 | 0.95 | explicit: IIconSection implementation | +| `lib/Settings/AdminSettings.php` | `__construct()` | REQ-ADMIN-001 | 0.95 | explicit: ISettings implementation for panel registration | +| `lib/Settings/AdminSettings.php` | `getForm()` | REQ-ADMIN-001 | 0.95 | explicit: ISettings implementation for panel registration | +| `lib/Settings/AdminSettings.php` | `getSection()` | REQ-ADMIN-001 | 0.95 | explicit: ISettings implementation for panel registration | +| `lib/Settings/AdminSettings.php` | `getPriority()` | REQ-ADMIN-001 | 0.95 | explicit: ISettings implementation for panel registration | +| `src/views/settings/AdminRoot.vue` | `reimport()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/CaseTypeAdmin.vue` | `openDetail()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/CaseTypeDetail.vue` | `loadCaseType()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/CaseTypeDetail.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/CaseTypeList.vue` | `fetchCaseTypes()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/CaseTypeList.vue` | `for()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/MapLayerSettings.vue` | `emptyForm()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/ParafeerRouteAdmin.vue` | `loadData()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/PartnerAdmin.vue` | `editPartner()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/Settings.vue` | `save()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/Settings.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/Settings.vue` | `setTimeout()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/WorkflowEditor.vue` | `loadData()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/ZgwMappingSettings.vue` | `editMapping()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/DurationPicker.vue` | `onDaysChange()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/DurationPicker.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/LhsMatrixAdmin.vue` | `updateCell()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/LhsMatrixAdmin.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/StepConfigPanel.vue` | `parseChecklist()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/StepConfigPanel.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/StepConfigPanel.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/TransitionConfigPanel.vue` | `parseGuards()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/TransitionConfigPanel.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/TransitionConfigPanel.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/VthTemplateLibrary.vue` | `selectTemplate()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/WorkflowNode.vue` | `onMouseDown()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/components/WorkflowPalette.vue` | `onDragStart()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/AiSettingsTab.vue` | `updateSetting()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/AppointmentSettingsTab.vue` | `saveBackend()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/BerichtenboxSettingsTab.vue` | `testConnection()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/ChecklistAdmin.vue` | `createChecklist()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/DocumentTypesTab.vue` | `loadItems()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/PropertiesTab.vue` | `fetchPropertyDefs()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/ResultTypesTab.vue` | `loadItems()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/ResultsTab.vue` | `formatPeriod()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/ResultsTab.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/ResultsTab.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/RoleTypesTab.vue` | `loadItems()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/RolesTab.vue` | `genericRoleLabel()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/StatusesTab.vue` | `getEmptyForm()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/TemplatesTab.vue` | `loadTemplates()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/TemplatesTab.vue` | `generateUrl()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/TenantSettingsTab.vue` | `create()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/WorkflowTab.vue` | `loadVersions()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/settings/tabs/WorkflowTab.vue` | `if()` | REQ-ADMIN-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: bezwaar-lifecycle — 4 methods across 3 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/views/complaints/ComplaintDetail.vue` | `loadComplaint()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/complaints/ComplaintList.vue` | `loadComplaints()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/complaints/components/ComplaintCreateDialog.vue` | `validate()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/complaints/components/ComplaintCreateDialog.vue` | `if()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: case-dashboard-view — 12 methods across 4 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/views/cases/widgets/CaseDocumentsWidget.vue` | `getFileIcon()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CaseDocumentsWidget.vue` | `if()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CaseDocumentsWidget.vue` | `if()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CaseDocumentsWidget.vue` | `if()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CaseDocumentsWidget.vue` | `if()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CasePropertiesWidget.vue` | `save()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CasePropertiesWidget.vue` | `if()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CaseTasksWidget.vue` | `dueDateClass()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CaseTasksWidget.vue` | `if()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CaseTasksWidget.vue` | `if()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CaseTimelineWidget.vue` | `onStatusSelected()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/widgets/CaseTimelineWidget.vue` | `if()` | REQ-CDV-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: case-management — 93 methods across 51 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Service/CaseEmailService.php` | `extractCaseNumber()` | REQ-CM-01 | 0.75 ⚠️ NEEDS-REVIEW | name+path keyword match | +| `lib/Service/CaseEmailService.php` | `getTemplatesForCaseType()` | REQ-CM-01 | 0.75 ⚠️ NEEDS-REVIEW | name+path keyword match | +| `lib/Service/CaseEmailService.php` | `loadTemplate()` | REQ-CM-01 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/CaseEmailService.php` | `loadCaseData()` | REQ-CM-01 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/CaseEmailService.php` | `recordSentEmail()` | REQ-CM-01 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/CaseEmailService.php` | `recordReceivedEmail()` | REQ-CM-01 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/CaseEmailService.php` | `findCaseByIdentifier()` | REQ-CM-01 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `src/utils/caseHelpers.js` | `calculateDeadline()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `generateIdentifier()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `isCaseOverdue()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `isCaseDueToday()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `isCaseDueTomorrow()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `getCaseOverdueText()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `formatDeadlineCountdown()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `getDaysElapsed()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `getDaysRemaining()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `formatDate()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseHelpers.js` | `formatDateShort()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseValidation.js` | `isCaseTypeUsable()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseValidation.js` | `getCaseTypeUnusableReason()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseValidation.js` | `validateCaseCreate()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseValidation.js` | `validateCaseUpdate()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseValidation.js` | `validateStatusChange()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/CaseCreateDialog.vue` | `loadCaseTypes()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/CaseDetail.vue` | `getTaskPriorityLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/CaseList.vue` | `loadCaseTypes()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/CaseList.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/CaseList.vue` | `for()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/ActivityTimeline.vue` | `getIcon()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AddParticipantDialog.vue` | `submit()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AddParticipantDialog.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AdvicePanel.vue` | `defaultDeadline()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AdviceRequestPanel.vue` | `getStatusLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AiAssistantPanel.vue` | `askQuestion()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AiAssistantPanel.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AiClassifyDialog.vue` | `classify()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AiExtractDialog.vue` | `extract()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AiSuggestionCard.vue` | `formatValue()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AiSuggestionCard.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AiSummaryPanel.vue` | `generate()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AppointmentBookingDialog.vue` | `loadSlots()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AppointmentBookingDialog.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/AppointmentSection.vue` | `loadAppointments()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/BerichtenboxComposeDialog.vue` | `validate()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/BerichtenboxComposeDialog.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/BerichtenboxTab.vue` | `loadMessages()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/CaseTransferDialog.vue` | `submitTransfer()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/ConsultationPanel.vue` | `getStatusLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/CreateShareDialog.vue` | `createShare()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/CustomPropertiesPanel.vue` | `loadData()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/DecisionsSection.vue` | `loadData()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/DocumentAssessmentPanel.vue` | `getAssessment()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/DocumentChecklist.vue` | `loadData()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/EmailComposer.vue` | `onTemplateSelected()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/EmailComposer.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/EmailThread.vue` | `formatDateTime()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/EmailThread.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/EmailThread.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/EnforcementPanel.vue` | `statusLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/EnforcementWizard.vue` | `submit()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/InspectionChecklistPanel.vue` | `startInspection()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/InspectionPanel.vue` | `resultLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/LocationTab.vue` | `loadAddress()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/LocationTab.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/MilestoneProgress.vue` | `stepClass()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/ParticipantsSection.vue` | `fetchData()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/QuickStatusDropdown.vue` | `onStatusChange()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/QuickStatusDropdown.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/ResultSection.vue` | `formatPeriod()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/ResultSection.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/ResultSection.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/ResultSection.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/ShareTab.vue` | `permissionLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/StatusTimeline.vue` | `isPassed()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/SubCasesSection.vue` | `fetchSubCases()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/SubCasesSection.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/SubCasesSection.vue` | `for()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/TenantSwitcher.vue` | `switchTenant()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/TenantSwitcher.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/VoorstellenPanel.vue` | `loadVoorstellen()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/WooIntakeForm.vue` | `update()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/WorkflowTransitions.vue` | `loadWorkflow()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/WorkflowTransitions.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/WorkflowTransitions.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/beroep/BeroepEscalationPanel.vue` | `escalate()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/beroep/CourtProceedingsPanel.vue` | `getRulingLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/bezwaar/AdvisoryReportPanel.vue` | `getAdviceTypeLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/bezwaar/BezwaarDecisionForm.vue` | `getDispositionLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/bezwaar/BezwaarIntakeForm.vue` | `loadExistingObjection()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/bezwaar/BezwaarIntakeForm.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/bezwaar/BezwaarIntakeForm.vue` | `if()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/bezwaar/BezwaarTimeline.vue` | `getAdviceTypeLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/cases/components/bezwaar/HearingPanel.vue` | `getHearingStatusLabel()` | REQ-CM-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: case-map-overview — 5 methods across 2 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/views/CaseMapView.vue` | `loadData()` | REQ-OVERVIEW-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/dashboard/CaseMapWidget.vue` | `getColor()` | REQ-OVERVIEW-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/dashboard/CaseMapWidget.vue` | `if()` | REQ-OVERVIEW-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/dashboard/CaseMapWidget.vue` | `if()` | REQ-OVERVIEW-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/dashboard/CaseMapWidget.vue` | `if()` | REQ-OVERVIEW-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: case-types — 5 methods across 1 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/utils/caseTypeValidation.js` | `getOriginOptions()` | REQ-CT-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseTypeValidation.js` | `getConfidentialityOptions()` | REQ-CT-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseTypeValidation.js` | `validateCaseType()` | REQ-CT-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseTypeValidation.js` | `validateForPublish()` | REQ-CT-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/caseTypeValidation.js` | `getFieldLabel()` | REQ-CT-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: dashboard — 18 methods across 6 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/utils/dashboardHelpers.js` | `todayString()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `computeKpis()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `aggregateByStatus()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `getOverdueCases()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `getRecentActivity()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `getMyWorkItems()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `endOfWeek()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `getGroupedMyWorkItems()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `getDeadlineAlerts()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `getTaskDueReminders()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `getStalledCases()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/dashboardHelpers.js` | `formatRelativeTime()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/Dashboard.vue` | `loadDashboardData()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/Dashboard.vue` | `for()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/dashboard/ActivityFeed.vue` | `typeIcon()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/dashboard/StatusChart.vue` | `barWidth()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/widgets/CasesOverviewWidget.vue` | `onShow()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/widgets/StartCaseWidget.vue` | `fetchCaseTypes()` | REQ-DASH-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: doorlooptijd-dashboard — 25 methods across 5 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Controller/MilestoneController.php` | `__construct()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestone endpoints | +| `lib/Controller/MilestoneController.php` | `progress()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestone endpoints | +| `lib/Controller/MilestoneController.php` | `mark()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestone endpoints | +| `lib/Controller/MilestoneController.php` | `reverse()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestone endpoints | +| `lib/Service/MilestoneService.php` | `__construct()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestones = doorloop milestones | +| `lib/Service/MilestoneService.php` | `getMilestones()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestones = doorloop milestones | +| `lib/Service/MilestoneService.php` | `getCaseProgress()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestones = doorloop milestones | +| `lib/Service/MilestoneService.php` | `markMilestone()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestones = doorloop milestones | +| `lib/Service/MilestoneService.php` | `reverseMilestone()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestones = doorloop milestones | +| `lib/Service/MilestoneService.php` | `getDurationAnalytics()` | REQ-006 | 0.8 ⚠️ NEEDS-REVIEW | explicit: Milestones = doorloop milestones | +| `lib/Service/MilestoneService.php` | `getMilestoneRecords()` | REQ-006 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `src/utils/doorlooptijdHelpers.js` | `parseDurationToDays()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/doorlooptijdHelpers.js` | `getProcessingDays()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/doorlooptijdHelpers.js` | `getSlaTargetDays()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/doorlooptijdHelpers.js` | `buildCaseTypeMap()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/doorlooptijdHelpers.js` | `computeSlaCompliance()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/doorlooptijdHelpers.js` | `computeProcessingTimeDistribution()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/doorlooptijdHelpers.js` | `computeMonthlyTrend()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/doorlooptijdHelpers.js` | `getAtRiskCases()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/doorlooptijdHelpers.js` | `computePerformanceTable()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/durationHelpers.js` | `isValidDuration()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/durationHelpers.js` | `parseDuration()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/durationHelpers.js` | `formatDuration()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/durationHelpers.js` | `getDurationError()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/DoorlooptijdDashboard.vue` | `loadData()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: inspection-checklists — 18 methods across 3 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Controller/InspectionController.php` | `__construct()` | REQ-001 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection controller methods | +| `lib/Controller/InspectionController.php` | `index()` | REQ-001 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection controller methods | +| `lib/Controller/InspectionController.php` | `captureLocation()` | REQ-001 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection controller methods | +| `lib/Controller/InspectionController.php` | `completeChecklistItem()` | REQ-001 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection controller methods | +| `lib/Controller/InspectionController.php` | `addPhoto()` | REQ-001 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection controller methods | +| `lib/Controller/InspectionController.php` | `complete()` | REQ-001 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection controller methods | +| `lib/Controller/InspectionController.php` | `getRequestBody()` | REQ-001 | 0.73 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ChecklistService.php` | `__construct()` | REQ-001 | 0.82 ⚠️ NEEDS-REVIEW | explicit: Checklist validation and progress | +| `lib/Service/ChecklistService.php` | `completeItem()` | REQ-001 | 0.82 ⚠️ NEEDS-REVIEW | explicit: Checklist validation and progress | +| `lib/Service/ChecklistService.php` | `getProgress()` | REQ-001 | 0.82 ⚠️ NEEDS-REVIEW | explicit: Checklist validation and progress | +| `lib/Service/ChecklistService.php` | `validateCompletion()` | REQ-001 | 0.82 ⚠️ NEEDS-REVIEW | explicit: Checklist validation and progress | +| `lib/Service/ChecklistService.php` | `getConformitySummary()` | REQ-001 | 0.82 ⚠️ NEEDS-REVIEW | explicit: Checklist validation and progress | +| `lib/Service/InspectionService.php` | `__construct()` | REQ-003 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection service methods | +| `lib/Service/InspectionService.php` | `getInspections()` | REQ-003 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection service methods | +| `lib/Service/InspectionService.php` | `captureLocation()` | REQ-003 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection service methods | +| `lib/Service/InspectionService.php` | `addPhoto()` | REQ-003 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection service methods | +| `lib/Service/InspectionService.php` | `completeInspection()` | REQ-003 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Inspection service methods | +| `lib/Service/InspectionService.php` | `calculateDistance()` | REQ-003 | 0.73 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | + +### capability: map-component — 9 methods across 5 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/components/map/AddressSearch.vue` | `onInput()` | REQ-MAP-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/components/map/AddressSearch.vue` | `if()` | REQ-MAP-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/components/map/CaseMap.vue` | `initMap()` | REQ-MAP-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/components/map/LocationPicker.vue` | `initMap()` | REQ-MAP-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/components/map/LocationPicker.vue` | `if()` | REQ-MAP-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/components/map/LocationPicker.vue` | `if()` | REQ-MAP-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/components/map/MapLayerSwitcher.vue` | `toggleLayer()` | REQ-MAP-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/components/map/MapLayerSwitcher.vue` | `if()` | REQ-MAP-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/components/map/SpatialFilter.vue` | `initDrawLayer()` | REQ-MAP-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: my-work — 5 methods across 3 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/views/MyWork.vue` | `getCaseTypeName()` | REQ-MYWORK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/Werkvoorraad.vue` | `loadData()` | REQ-MYWORK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/Werkvoorraad.vue` | `if()` | REQ-MYWORK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/Werkvoorraad.vue` | `if()` | REQ-MYWORK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/widgets/MyTasksWidget.vue` | `onShow()` | REQ-MYWORK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: openregister-integration — 2 methods across 1 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/utils/openregisterCheck.js` | `checkOpenRegisterStatus()` | REQ-OREG-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/openregisterCheck.js` | `getStatusMessage()` | REQ-OREG-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: parafeerroute-engine — 9 methods across 1 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/utils/parafeerEngine.js` | `getRouteSteps()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/parafeerEngine.js` | `getCurrentStep()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/parafeerEngine.js` | `isActiveActor()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/parafeerEngine.js` | `getNextStep()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/parafeerEngine.js` | `getStatusAfterAdvance()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/parafeerEngine.js` | `createRouteSnapshot()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/parafeerEngine.js` | `insertAdHocStep()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/parafeerEngine.js` | `markStepSkipped()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/parafeerEngine.js` | `findDefaultRoute()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: parafering-actions — 15 methods across 3 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Controller/ParaferingController.php` | `__construct()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering controller | +| `lib/Controller/ParaferingController.php` | `startParafering()` | REQ-002 | 0.85 | explicit: Parafering route start | +| `lib/Controller/ParaferingController.php` | `paraferen()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering controller | +| `lib/Controller/ParaferingController.php` | `terugsturen()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering controller | +| `lib/Controller/ParaferingController.php` | `adviseren()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering controller | +| `lib/Controller/ParaferingController.php` | `auditTrail()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering controller | +| `lib/Service/ParaferingNotificationService.php` | `__construct()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering notifications — NEEDS-REVIEW specific REQ | +| `lib/Service/ParaferingNotificationService.php` | `notifyStepActivated()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering notifications — NEEDS-REVIEW specific REQ | +| `lib/Service/ParaferingNotificationService.php` | `notifyVoorstelReturned()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering notifications — NEEDS-REVIEW specific REQ | +| `lib/Service/ParaferingNotificationService.php` | `notifyParaferingReminder()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering notifications — NEEDS-REVIEW specific REQ | +| `lib/Service/ParaferingService.php` | `__construct()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering service — specific REQ per method deferred | +| `lib/Service/ParaferingService.php` | `startParafering()` | REQ-002 | 0.85 | explicit: Parafering route start | +| `lib/Service/ParaferingService.php` | `executeAction()` | REQ-002 | 0.85 | explicit: Parafering action execution | +| `lib/Service/ParaferingService.php` | `getCurrentStep()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering service — specific REQ per method deferred | +| `lib/Service/ParaferingService.php` | `overrideRoute()` | REQ-002 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Parafering service — specific REQ per method deferred | + +### capability: parafering-audit-trail — 1 methods across 1 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Service/ParaferingService.php` | `getAuditTrail()` | REQ-001 | 0.9 | explicit: Audit trail query | + +### capability: pdok-integration — 11 methods across 2 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/services/coordinateService.js` | `isRDCoordinate()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/coordinateService.js` | `rdToWgs84()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/coordinateService.js` | `wgs84ToRd()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/coordinateService.js` | `ensureWgs84()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/coordinateService.js` | `convertCoordinates()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/pdokService.js` | `suggest()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/pdokService.js` | `lookup()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/pdokService.js` | `free()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/pdokService.js` | `reverse()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/pdokService.js` | `extractCoordinates()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/pdokService.js` | `formatAddress()` | REQ-PDOK-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: procest-app-scaffold — 13 methods across 6 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/AppInfo/Application.php` | `register()` | REQ-001 | 0.95 | explicit: Application::register = NC app registration boot (REQ-001) | +| `lib/AppInfo/Application.php` | `boot()` | REQ-001 | 0.95 | explicit: Application::boot = NC app boot hook | +| `lib/Controller/DashboardController.php` | `page()` | REQ-002 | 0.93 | explicit: Vue SPA entry point (REQ-002) | +| `lib/Repair/InitializeSettings.php` | `__construct()` | REQ-006 | 0.92 | explicit: Settings initialization on install | +| `lib/Repair/InitializeSettings.php` | `getName()` | REQ-006 | 0.92 | explicit: Settings initialization on install | +| `lib/Repair/InitializeSettings.php` | `run()` | REQ-006 | 0.92 | explicit: Settings initialization on install | +| `src/App.vue` | `onSidebarSearch()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/App.vue` | `if()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/navigation/MainMenu.vue` | `openLink()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/i18nResolver.js` | `getUserLocale()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/i18nResolver.js` | `resolveTranslatable()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/i18nResolver.js` | `resolveField()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/i18nResolver.js` | `resolveText()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: procest-object-store — 5 methods across 3 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/store/modules/bezwaar.js` | `addWorkingDays()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/store/modules/bezwaar.js` | `addWeeks()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/store/modules/bezwaar.js` | `daysDifference()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/store/modules/workflow.js` | `generateUUID()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/store/store.js` | `initializeStores()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: prometheus-metrics — 19 methods across 2 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Controller/HealthController.php` | `__construct()` | REQ-PROM-004 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Health endpoint helpers | +| `lib/Controller/HealthController.php` | `index()` | REQ-PROM-004 | 0.97 | explicit: /health endpoint | +| `lib/Controller/HealthController.php` | `checkDatabase()` | REQ-PROM-004 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/HealthController.php` | `checkOpenRegister()` | REQ-PROM-004 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/HealthController.php` | `checkFilesystem()` | REQ-PROM-004 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/HealthController.php` | `getAppVersion()` | REQ-PROM-004 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `__construct()` | REQ-PROM-001 | 0.83 ⚠️ NEEDS-REVIEW | explicit: Metrics endpoint helpers — private fall back here via Pass B | +| `lib/Controller/MetricsController.php` | `index()` | REQ-PROM-001 | 0.97 | explicit: /metrics endpoint | +| `lib/Controller/MetricsController.php` | `collectMetrics()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `getCached()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `checkDatabaseHealth()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `getCaseCounts()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `getOverdueCasesCount()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `getCasesCreatedTodayCount()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `getTaskCounts()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `getOverdueTasksCount()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `getAppVersion()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `getNextcloudVersion()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/MetricsController.php` | `sanitizeLabel()` | REQ-PROM-001 | 0.87 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | + +### capability: roles-decisions — 3 methods across 1 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/utils/decisionHelpers.js` | `getDecisionValidity()` | REQ-ROLE-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/decisionHelpers.js` | `formatDecisionDate()` | REQ-ROLE-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/decisionHelpers.js` | `validateDecision()` | REQ-ROLE-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: signalering-widgets — 7 methods across 5 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/views/dashboard/OverduePanel.vue` | `severityClass()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/dashboard/OverduePanel.vue` | `if()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/dashboard/OverduePanel.vue` | `if()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/widgets/DeadlineAlertsWidget.vue` | `onShow()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/widgets/OverdueCasesWidget.vue` | `onShow()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/widgets/StalledCasesWidget.vue` | `onShow()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/widgets/TaskRemindersWidget.vue` | `onShow()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: task-management — 27 methods across 7 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `src/services/taskApi.js` | `getHeaders()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/taskApi.js` | `mapCalDavPriority()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/taskApi.js` | `normalizeCalDavTask()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/taskApi.js` | `fetchTasksForObject()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/taskApi.js` | `fetchTasksForCases()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskHelpers.js` | `getPriorityLevels()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskHelpers.js` | `isOverdue()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskHelpers.js` | `isDueToday()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskHelpers.js` | `getOverdueText()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskHelpers.js` | `formatDueDate()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskHelpers.js` | `prioritySortWeight()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskHelpers.js` | `statusGroupWeight()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskHelpers.js` | `sortTasks()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskLifecycle.js` | `getStatusLabels()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskLifecycle.js` | `getTransitionLabels()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskLifecycle.js` | `getAllowedTransitions()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskLifecycle.js` | `validateTransition()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskLifecycle.js` | `getStatusLabel()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskLifecycle.js` | `getTransitionLabel()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskLifecycle.js` | `isTerminalStatus()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskValidation.js` | `validateTaskCreate()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskValidation.js` | `validateTaskUpdate()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/utils/taskValidation.js` | `validateTaskTransition()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/tasks/TaskCreateDialog.vue` | `submit()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/tasks/TaskCreateDialog.vue` | `if()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/tasks/TaskDetail.vue` | `startEditing()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/tasks/TaskList.vue` | `getPriorityLabel()` | REQ-TASK-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: voorstel-management — 17 methods across 10 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Controller/ParaferingController.php` | `createVoorstel()` | REQ-002 | 0.9 | explicit: Create voorstel from case | +| `lib/Controller/ParaferingController.php` | `handleAction()` | REQ-002 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ParaferingController.php` | `getRequestBody()` | REQ-002 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ParaferingService.php` | `createVoorstel()` | REQ-002 | 0.9 | explicit: Create voorstel from case | +| `lib/Service/ParaferingService.php` | `advanceStep()` | REQ-002 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ParaferingService.php` | `handleParallelStep()` | REQ-002 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ParaferingService.php` | `generateId()` | REQ-002 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `src/views/voorstellen/VoorstelDetail.vue` | `loadVoorstel()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/voorstellen/VoorstelList.vue` | `loadVoorstellen()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/voorstellen/components/AuditTrail.vue` | `formatAction()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/voorstellen/components/BesluitRegistration.vue` | `register()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/voorstellen/components/BesluitRegistration.vue` | `if()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/voorstellen/components/ParafeerActionBar.vue` | `formatStepType()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/voorstellen/components/ParafeerInbox.vue` | `loadVoorstellen()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/voorstellen/components/ProgressTimeline.vue` | `isCompleted()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/voorstellen/components/VoorstelCreateDialog.vue` | `onCaseSelected()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/views/voorstellen/components/VoorstelCreateDialog.vue` | `if()` | REQ-001 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: vth-case-type-seed — 13 methods across 2 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Repair/SeedBezwaarBeroepData.php` | `__construct()` | REQ-001 | 0.92 | explicit: Seed repair step | +| `lib/Repair/SeedBezwaarBeroepData.php` | `getName()` | REQ-001 | 0.92 | explicit: Seed repair step | +| `lib/Repair/SeedBezwaarBeroepData.php` | `run()` | REQ-001 | 0.92 | explicit: Seed repair step | +| `lib/Service/SeedDataService.php` | `__construct()` | REQ-001 | 0.85 | explicit: Seed data service | +| `lib/Service/SeedDataService.php` | `seedBezwaarBeroepData()` | REQ-001 | 0.85 | explicit: Seed data service | +| `lib/Service/SeedDataService.php` | `seedCaseType()` | REQ-001 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/SeedDataService.php` | `resolveWorkflowReferences()` | REQ-001 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/SeedDataService.php` | `createObject()` | REQ-001 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/SeedDataService.php` | `findByFilter()` | REQ-001 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/SeedDataService.php` | `getObjectService()` | REQ-001 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/SeedDataService.php` | `getConfigValue()` | REQ-001 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/SeedDataService.php` | `getObjectId()` | REQ-001 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/SeedDataService.php` | `generateUUID()` | REQ-001 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | + +### capability: wms-wfs-layers — 8 methods across 3 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Controller/GisProxyController.php` | `proxy()` | REQ-LAYER-03 | 0.93 | name+path keyword match | +| `lib/Service/GisProxyService.php` | `proxyRequest()` | REQ-LAYER-03 | 0.93 | name+path keyword match | +| `lib/Service/GisProxyService.php` | `isUrlAllowed()` | REQ-LAYER-03 | 0.83 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/GisProxyService.php` | `checkRateLimit()` | REQ-LAYER-03 | 0.83 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/GisProxyService.php` | `parseCapabilities()` | REQ-LAYER-03 | 0.83 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/GisProxyService.php` | `xmlToArray()` | REQ-LAYER-03 | 0.83 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `src/services/gisProxyService.js` | `proxyRequest()` | REQ-LAYER-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | +| `src/services/gisProxyService.js` | `getCapabilities()` | REQ-LAYER-01 | 0.78 ⚠️ NEEDS-REVIEW | frontend path-based capability match; specific REQ per method deferred | + +### capability: zgw-api-mapping — 236 methods across 12 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Controller/AcController.php` | `__construct()` | REQ-007 | 0.85 | explicit: AcController=AC API | +| `lib/Controller/AcController.php` | `index()` | REQ-007 | 0.85 | explicit: AcController=AC API | +| `lib/Controller/AcController.php` | `create()` | REQ-007 | 0.85 | explicit: AcController=AC API | +| `lib/Controller/AcController.php` | `show()` | REQ-007 | 0.85 | explicit: AcController=AC API | +| `lib/Controller/AcController.php` | `update()` | REQ-007 | 0.85 | explicit: AcController=AC API | +| `lib/Controller/AcController.php` | `patch()` | REQ-007 | 0.85 | explicit: AcController=AC API | +| `lib/Controller/AcController.php` | `destroy()` | REQ-007 | 0.85 | explicit: AcController=AC API | +| `lib/Controller/AcController.php` | `findConsumerByUuid()` | REQ-007 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/AcController.php` | `validateApplicatieBody()` | REQ-007 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/AcController.php` | `validateClientIdUniqueness()` | REQ-007 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/AcController.php` | `validateAutorisatieConsistency()` | REQ-007 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/AcController.php` | `validateAutorisatieScopes()` | REQ-007 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/AcController.php` | `scopesContain()` | REQ-007 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/AcController.php` | `getConsumerClientIds()` | REQ-007 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/AcController.php` | `consumerToApplicatie()` | REQ-007 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/AcController.php` | `applicatieToConsumer()` | REQ-007 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/BrcController.php` | `__construct()` | REQ-006 | 0.92 | explicit: BrcController=BRC API, REQ-006 covers BRC mappability | +| `lib/Controller/BrcController.php` | `index()` | REQ-006 | 0.92 | explicit: BrcController=BRC API, REQ-006 covers BRC mappability | +| `lib/Controller/BrcController.php` | `create()` | REQ-006 | 0.92 | explicit: BrcController=BRC API, REQ-006 covers BRC mappability | +| `lib/Controller/BrcController.php` | `show()` | REQ-006 | 0.92 | explicit: BrcController=BRC API, REQ-006 covers BRC mappability | +| `lib/Controller/BrcController.php` | `update()` | REQ-006 | 0.92 | explicit: BrcController=BRC API, REQ-006 covers BRC mappability | +| `lib/Controller/BrcController.php` | `patch()` | REQ-006 | 0.92 | explicit: BrcController=BRC API, REQ-006 covers BRC mappability | +| `lib/Controller/BrcController.php` | `destroy()` | REQ-006 | 0.92 | explicit: BrcController=BRC API, REQ-006 covers BRC mappability | +| `lib/Controller/BrcController.php` | `audittrailIndex()` | REQ-006 | 0.92 | explicit: BrcController=BRC API, REQ-006 covers BRC mappability | +| `lib/Controller/BrcController.php` | `audittrailShow()` | REQ-006 | 0.92 | explicit: BrcController=BRC API, REQ-006 covers BRC mappability | +| `lib/Controller/BrcController.php` | `createBesluitWithZaakSync()` | REQ-006 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/BrcController.php` | `syncZaakBesluitToZrc()` | REQ-006 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/BrcController.php` | `indexBesluitInformatieObjecten()` | REQ-006 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/BrcController.php` | `createBesluitInformatieObject()` | REQ-006 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/BrcController.php` | `createOioInDrc()` | REQ-006 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/BrcController.php` | `deleteOiosForBesluit()` | REQ-006 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/BrcController.php` | `destroyBesluitInformatieObject()` | REQ-006 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/BrcController.php` | `deleteOioByBesluitAndIo()` | REQ-006 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/BrcController.php` | `destroyBesluit()` | REQ-006 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `__construct()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `index()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `create()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `show()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `update()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `patch()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `destroy()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `download()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `lock()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `unlock()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `audittrailIndex()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `audittrailShow()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `uploadChunk()` | REQ-005 | 0.92 | explicit: DrcController=DRC API, REQ-005 covers DRC mappability | +| `lib/Controller/DrcController.php` | `indexFlatArray()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `lockFallback()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `unlockFallback()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `findOioRelationsForEio()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `searchRelationsInSchema()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `extractIdsFromResults()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `cascadeDeleteGebruiksrechten()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `updateIndicatieGebruiksrecht()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `getGebruiksrechtData()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `checkAndClearIndicatieGebruiksrecht()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `setIndicatieGebruiksrecht()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `enrichWithBestandsdelen()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `parseFileParts()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `buildBestandsdelenArray()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `handleEioUpdate()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `checkDocumentLock()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `resolveStoredLockId()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `storeLockIdInData()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/DrcController.php` | `clearLockIdInData()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/NrcController.php` | `__construct()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/NrcController.php` | `index()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/NrcController.php` | `create()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/NrcController.php` | `show()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/NrcController.php` | `update()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/NrcController.php` | `patch()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/NrcController.php` | `destroy()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/NrcController.php` | `notificatieCreate()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/NrcController.php` | `audittrailIndex()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/NrcController.php` | `audittrailShow()` | REQ-008 | 0.85 | explicit: NrcController=NRC API | +| `lib/Controller/ZgwMappingController.php` | `__construct()` | REQ-001 | 0.85 | explicit: ZGW mapping admin endpoints | +| `lib/Controller/ZgwMappingController.php` | `index()` | REQ-001 | 0.85 | explicit: ZGW mapping admin endpoints | +| `lib/Controller/ZgwMappingController.php` | `show()` | REQ-001 | 0.85 | explicit: ZGW mapping admin endpoints | +| `lib/Controller/ZgwMappingController.php` | `update()` | REQ-001 | 0.85 | explicit: ZGW mapping admin endpoints | +| `lib/Controller/ZgwMappingController.php` | `destroy()` | REQ-001 | 0.85 | explicit: ZGW mapping admin endpoints | +| `lib/Controller/ZgwMappingController.php` | `reset()` | REQ-001 | 0.85 | explicit: ZGW mapping admin endpoints | +| `lib/Controller/ZrcController.php` | `__construct()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `index()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `create()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `show()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `update()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `patch()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `destroy()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `zaakeigenschappenIndex()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `zaakeigenschappenCreate()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `zaakeigenschappenShow()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `zaakeigenschappenUpdate()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `zaakeigenschappenPatch()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `zaakeigenschappenDestroy()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `zaakbesluitenIndex()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `zoek()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `audittrailIndex()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `audittrailShow()` | REQ-003 | 0.92 | explicit: ZrcController=ZRC API, REQ-003 covers ZRC mappability | +| `lib/Controller/ZrcController.php` | `checkZaakReadAccess()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `filterZakenByAuthorisation()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `permissionDeniedResponse()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `preValidateZaakBody()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `preValidateProductenOfDiensten()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `destroyZaak()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `resolveZaakClosedForExisting()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `checkReopenScope()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `checkIndicatieGebruiksrechtBeforeClose()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `isEindstatusByVolgnummer()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `handleEindstatusEffect()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `setIndicatieGebruiksrechtOnClose()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `handleResultaatCreated()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `deriveArchiefactiedatum()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `resolveArchiveBaseDate()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `resolveEigenschapDate()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `resolveBesluitDate()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `enrichZioResponse()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `enrichZioJsonResponse()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `syncCreateObjectInformatieObject()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `getZioDataForOioSync()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZrcController.php` | `syncDeleteObjectInformatieObject()` | REQ-003 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZtcController.php` | `__construct()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `index()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `create()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `show()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `update()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `patch()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `destroy()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `publishZaaktype()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `publishBesluittype()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `publishInformatieobjecttype()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `audittrailIndex()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `audittrailShow()` | REQ-004 | 0.92 | explicit: ZtcController=ZTC API, REQ-004 covers ZTC mappability | +| `lib/Controller/ZtcController.php` | `resolveParentDraft()` | REQ-004 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZtcController.php` | `handlePublish()` | REQ-004 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZtcController.php` | `enrichCrossReferences()` | REQ-004 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZtcController.php` | `enrichBesluittype()` | REQ-004 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZtcController.php` | `enrichZaaktype()` | REQ-004 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZtcController.php` | `filterByDatumGeldigheid()` | REQ-004 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZtcController.php` | `filterValidUrls()` | REQ-004 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZtcController.php` | `isUrlValid()` | REQ-004 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Controller/ZtcController.php` | `resolveIotByOmschrijving()` | REQ-004 | 0.82 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `__construct()` | REQ-001 | 0.9 | explicit: Seeds default ZGW mappings on install | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getName()` | REQ-001 | 0.9 | explicit: Seeds default ZGW mappings on install | +| `lib/Repair/LoadDefaultZgwMappings.php` | `run()` | REQ-001 | 0.9 | explicit: Seeds default ZGW mappings on install | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getDefaultMappings()` | REQ-001 | 0.9 | explicit: Seeds default ZGW mappings on install | +| `lib/Repair/LoadDefaultZgwMappings.php` | `patchExistingMappings()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `tplUrl()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getZaakMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getZaakTypeMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getStatusMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getStatusTypeMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getResultaatMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getResultaatTypeMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getRolMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getRolTypeMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getEigenschapMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getBesluitMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getBesluitTypeMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getInformatieObjectTypeMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getEnkelvoudigInformatieObjectMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getObjectInformatieObjectMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getGebruiksrechtenMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getKanaalMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getAbonnementMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getCatalogusMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getZaaktypeInformatieobjecttypeMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getApplicatieMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `createDefaultApplicaties()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getDefaultApplicaties()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `createDefaultKanalen()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getDefaultKanalen()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getZaakeigenschapMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getZaakinformatieobjectMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getZaakobjectMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getKlantcontactMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getBesluitinformatieobjectMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Repair/LoadDefaultZgwMappings.php` | `getVerzendingMapping()` | REQ-001 | 0.8 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwDocumentService.php` | `__construct()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `storeBase64()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `storeRaw()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `getContent()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `fileExists()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `deleteFiles()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `getMimeType()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `storeChunk()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `getUploadedChunks()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `mergeChunks()` | REQ-005 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW document handling (DRC mappability helpers) | +| `lib/Service/ZgwDocumentService.php` | `getDocumentFolder()` | REQ-005 | 0.72 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwDocumentService.php` | `getUserFolder()` | REQ-005 | 0.72 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwMappingService.php` | `__construct()` | REQ-001 | 0.85 | explicit: Explicit mapping-layer service | +| `lib/Service/ZgwMappingService.php` | `getMapping()` | REQ-001 | 0.85 | explicit: Explicit mapping-layer service | +| `lib/Service/ZgwMappingService.php` | `saveMapping()` | REQ-001 | 0.85 | explicit: Explicit mapping-layer service | +| `lib/Service/ZgwMappingService.php` | `listMappings()` | REQ-001 | 0.85 | explicit: Explicit mapping-layer service | +| `lib/Service/ZgwMappingService.php` | `deleteMapping()` | REQ-001 | 0.85 | explicit: Explicit mapping-layer service | +| `lib/Service/ZgwMappingService.php` | `getResourceKeys()` | REQ-001 | 0.85 | explicit: Explicit mapping-layer service | +| `lib/Service/ZgwMappingService.php` | `hasMapping()` | REQ-001 | 0.85 | explicit: Explicit mapping-layer service | +| `lib/Service/ZgwMappingService.php` | `resetToDefault()` | REQ-001 | 0.85 | explicit: Explicit mapping-layer service | +| `lib/Service/ZgwPaginationHelper.php` | `wrapResults()` | REQ-002 | 0.82 ⚠️ NEEDS-REVIEW | explicit: ZGW pagination helper — covers REQ-002 endpoint system | +| `lib/Service/ZgwService.php` | `__construct()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `getObjectService()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `getConsumerMapper()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `getZgwMappingService()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `getPaginationHelper()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `getDocumentService()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `getBusinessRulesService()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `getLogger()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `loadMappingConfig()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `translateQueryParams()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `createOutboundMapping()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `createInboundMapping()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `applyOutboundMapping()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `applyInboundMapping()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `getRequestBody()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `resolvePathUuid()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `updateCachedBodyField()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `buildBaseUrl()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `validateJwtAuth()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `consumerHasScope()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `getConsumerAuthorisaties()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `publishNotification()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `buildValidationError()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `unavailableResponse()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `mappingNotFoundResponse()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `handleIndex()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `handleCreate()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `handleShow()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `handleUpdate()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `handleDestroy()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `handleAudittrailIndex()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `handleAudittrailShow()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `resolveZaakClosed()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `resolveZaakClosedFromBody()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `resolveParentZaaktypeDraft()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `resolveParentZaaktypeDraftFromBody()` | REQ-002 | 0.85 | explicit: Central ZGW orchestrator — REQ-by-REQ mapping deferred to annotate | +| `lib/Service/ZgwService.php` | `mapAuditTrailToZgw()` | REQ-002 | 0.75 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | + +### capability: zgw-business-rules-compliance — 44 methods across 3 files + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| `lib/Service/ZgwBusinessRulesService.php` | `__construct()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Business rules dispatcher — routes to *RulesService | +| `lib/Service/ZgwBusinessRulesService.php` | `validate()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: Business rules dispatcher — routes to *RulesService | +| `lib/Service/ZgwBusinessRulesService.php` | `dispatchToRegister()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwBusinessRulesService.php` | `dispatchZrc()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwBusinessRulesService.php` | `dispatchZtc()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwBusinessRulesService.php` | `dispatchDrc()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwBusinessRulesService.php` | `dispatchBrc()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwBusinessRulesService.php` | `isValid()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `__construct()` | ZRC-007 | 0.75 ⚠️ NEEDS-REVIEW | explicit: Rules base class — shared helpers inherited by all rules services | +| `lib/Service/ZgwRulesBase.php` | `setContext()` | ZRC-007 | 0.75 ⚠️ NEEDS-REVIEW | explicit: Rules base class — shared helpers inherited by all rules services | +| `lib/Service/ZgwRulesBase.php` | `isValid()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `error()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `fieldError()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `fieldImmutableError()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `extractUuid()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `isValidUrl()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `validateTypeUrl()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `validateInformatieobjectUrl()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `validateExternalUrl()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `fetchExternalUrl()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `generateIdentificatie()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `findObjectByField()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `findAllObjectsByField()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `findBySchemaKey()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwRulesBase.php` | `checkFieldUniqueness()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwZrcRulesService.php` | `rulesZakenCreate()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `rulesZakenUpdate()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `rulesZakenPatch()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `rulesStatussenCreate()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `rulesResultatenCreate()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `rulesRollenCreate()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `rulesZaakinformatieobjectenCreate()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `rulesZaakinformatieobjectenUpdate()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `rulesZaakinformatieobjectenPatch()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `rulesZaakeigenschappenCreate()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `detectEindstatus()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `filterZakenForConsumer()` | ZRC-007 | 0.78 ⚠️ NEEDS-REVIEW | explicit: ZRC rules service — specific ZRC-NNN REQ per method requires readin... | +| `lib/Service/ZgwZrcRulesService.php` | `deriveVertrouwelijkheidaanduiding()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwZrcRulesService.php` | `validateSubResourceType()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwZrcRulesService.php` | `validateZioInformatieobjecttype()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwZrcRulesService.php` | `validateZaakFields()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwZrcRulesService.php` | `validateHoofdzaakNesting()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwZrcRulesService.php` | `validateProductenOfDiensten()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | +| `lib/Service/ZgwZrcRulesService.php` | `checkZioImmutability()` | ZRC-007 | 0.7 ⚠️ NEEDS-REVIEW | Pass B — inherited from public sibling in same class | + +## Bucket 2a — Existing capability, no REQ (reverse-spec --extend) + +### cluster: zgw-business-rules-compliance (39 methods) → `/opsx-reverse-spec procest --extend zgw-business-rules-compliance` + +- `lib/Service/ZgwBrcRulesService.php` — 10 methods: `rulesBesluitenCreate()`, `rulesBesluitenUpdate()`, `rulesBesluitenPatch()`, `rulesBesluitinformatieobjectenCreate()`, `checkBesluitTypeImmutability()`, `checkBesluitFieldImmutability()`, `preserveImmutableBesluitFields()`, `checkBesluitIdentificatieUnique()` + 2 more +- `lib/Service/ZgwDrcRulesService.php` — 13 methods: `rulesEnkelvoudiginformatieobjectenCreate()`, `rulesEnkelvoudiginformatieobjectenUpdate()`, `rulesEnkelvoudiginformatieobjectenPatch()`, `rulesEnkelvoudiginformatieobjectenDestroy()`, `rulesObjectinformatieobjectenCreate()`, `findOioRelationsForDocument()`, `validateIndicatieGebruiksrechtTrue()`, `validateObjectUrl()` + 5 more +- `lib/Service/ZgwZtcRulesService.php` — 16 methods: `checkConceptProtection()`, `defaultConcept()`, `preserveConcept()`, `rulesZaaktypenCreate()`, `rulesBesluittypenCreate()`, `rulesZaaktypeinformatieobjecttypenCreate()`, `rulesResultaattypenCreate()`, `checkDirectConceptProtection()` + 8 more + +### cluster: zgw-api-mapping (13 methods) → `/opsx-reverse-spec procest --extend zgw-api-mapping` + +- `lib/Middleware/ZgwAuthException.php::getStatusCode()` — Exception type for ZgwAuthMiddleware +- `lib/Middleware/ZgwAuthMiddleware.php` — 8 methods: `beforeController()`, `afterException()`, `isConfidentialityAllowed()`, `loadOpenRegisterServices()`, `enforceScopes()`, `scopeGrantCovers()`, `decodeJwtPayload()`, `findConsumerByIssuer()` +- `lib/Service/NotificatieService.php::publish()` — NotificatieService::publish() +- `lib/Service/NotificatieService.php::loadOpenRegisterServices()` — NotificatieService::loadOpenRegisterServices() +- `lib/Service/NotificatieService.php::deliver()` — NotificatieService::deliver() +- `lib/Service/NotificatieService.php::deliverToSubscription()` — NotificatieService::deliverToSubscription() + +### cluster: admin-settings (12 methods) → `/opsx-reverse-spec procest --extend admin-settings` + +- `lib/Controller/SettingsController.php::getObjectService()` — SettingsController::getObjectService() +- `lib/Controller/SettingsController.php::getConfigurationService()` — SettingsController::getConfigurationService() +- `lib/Controller/SettingsController.php::index()` — SettingsController::index() +- `lib/Controller/SettingsController.php::create()` — SettingsController::create() +- `lib/Controller/SettingsController.php::load()` — SettingsController::load() +- `lib/Service/SettingsService.php` — 7 methods: `isOpenRegisterAvailable()`, `loadConfiguration()`, `getSettings()`, `updateSettings()`, `getConfigValue()`, `setConfigValue()`, `autoConfigureAfterImport()` + +### cluster: workflow-import-export (11 methods) → `/opsx-reverse-spec procest --extend workflow-import-export` + +- `lib/Controller/CaseDefinitionController.php::export()` — CaseDefinitionController::export() +- `lib/Controller/CaseDefinitionController.php::validate()` — CaseDefinitionController::validate() +- `lib/Controller/CaseDefinitionController.php::import()` — CaseDefinitionController::import() +- `lib/Service/CaseDefinitionExportService.php::exportCaseDefinition()` — CaseDefinitionExportService::exportCaseDefinition() +- `lib/Service/CaseDefinitionExportService.php::buildManifest()` — CaseDefinitionExportService::buildManifest() +- `lib/Service/CaseDefinitionExportService.php::exportComponent()` — CaseDefinitionExportService::exportComponent() +- `lib/Service/CaseDefinitionExportService.php::incrementVersion()` — CaseDefinitionExportService::incrementVersion() +- `lib/Service/CaseDefinitionImportService.php::validatePackage()` — CaseDefinitionImportService::validatePackage() +- `lib/Service/CaseDefinitionImportService.php::importCaseDefinition()` — CaseDefinitionImportService::importCaseDefinition() +- `lib/Service/CaseDefinitionImportService.php::importComponent()` — CaseDefinitionImportService::importComponent() +- `lib/Service/CaseDefinitionImportService.php::importWorkflows()` — CaseDefinitionImportService::importWorkflows() + +### cluster: advice-management (10 methods) → `/opsx-reverse-spec procest --extend advice-management` + +- `lib/Controller/ConsultationController.php::index()` — ConsultationController::index() +- `lib/Controller/ConsultationController.php::create()` — ConsultationController::create() +- `lib/Controller/ConsultationController.php::updateStatus()` — ConsultationController::updateStatus() +- `lib/Controller/ConsultationController.php::submitResponse()` — ConsultationController::submitResponse() +- `lib/Controller/ConsultationController.php::overdue()` — ConsultationController::overdue() +- `lib/Service/ConsultationService.php::createConsultation()` — ConsultationService::createConsultation() +- `lib/Service/ConsultationService.php::getConsultationsForCase()` — ConsultationService::getConsultationsForCase() +- `lib/Service/ConsultationService.php::updateStatus()` — ConsultationService::updateStatus() +- `lib/Service/ConsultationService.php::submitResponse()` — ConsultationService::submitResponse() +- `lib/Service/ConsultationService.php::getOverdueConsultations()` — ConsultationService::getOverdueConsultations() + +### cluster: case-management (9 methods) → `/opsx-reverse-spec procest --extend case-management` + +- `lib/Controller/EmailController.php::send()` — EmailController::send() +- `lib/Controller/EmailController.php::sendFromTemplate()` — EmailController::sendFromTemplate() +- `lib/Controller/EmailController.php::preview()` — EmailController::preview() +- `lib/Controller/EmailController.php::templates()` — EmailController::templates() +- `lib/Service/CaseEmailService.php::sendEmail()` — CaseEmailService::sendEmail() +- `lib/Service/CaseEmailService.php::sendFromTemplate()` — CaseEmailService::sendFromTemplate() +- `lib/Service/CaseEmailService.php::resolveVariables()` — CaseEmailService::resolveVariables() +- `lib/Service/CaseEmailService.php::findUnresolvedVariables()` — CaseEmailService::findUnresolvedVariables() +- `lib/Service/CaseEmailService.php::processInbound()` — CaseEmailService::processInbound() + +### cluster: wms-wfs-layers (2 methods) → `/opsx-reverse-spec procest --extend wms-wfs-layers` + +- `lib/Controller/GisProxyController.php::capabilities()` — GisProxyController::capabilities() +- `lib/Service/GisProxyService.php::getCapabilities()` — GisProxyService::getCapabilities() + +## Bucket 2b — No capability owner (reverse-spec --cluster) + +### cluster: ai-assistant (43 methods) → `/opsx-reverse-spec procest --cluster ai-assistant` + +- `lib/Controller/AiController.php` — 12 methods: `classify()`, `extract()`, `ask()`, `summarize()`, `suggestRouting()`, `suggestNext()`, `recordAction()`, `auditIndex()` + 4 more +- `lib/Service/AiService.php` — 21 methods: `isEnabled()`, `isFeatureEnabled()`, `classifyDocument()`, `extractData()`, `askQuestion()`, `summarize()`, `suggestRouting()`, `suggestNextStep()` + 13 more +- `src/services/aiApi.js` — 10 methods: `classifyDocument()`, `extractData()`, `askQuestion()`, `summarize()`, `suggestRouting()`, `suggestNext()`, `getAuditLog()`, `getAiSettings()` + 2 more + +### cluster: appointments (35 methods) → `/opsx-reverse-spec procest --cluster appointments` + +- `lib/BackgroundJob/AppointmentReminderJob.php::run()` +- `lib/Controller/AppointmentController.php::index()` +- `lib/Controller/AppointmentController.php::create()` +- `lib/Controller/AppointmentController.php::cancel()` +- `lib/Controller/AppointmentController.php::noShow()` +- `lib/Controller/AppointmentController.php::timeslots()` +- `lib/Controller/PublicAppointmentController.php::view()` +- `lib/Controller/PublicAppointmentController.php::cancel()` +- `lib/Service/AppointmentBackend/JccBackend.php::getTimeslots()` +- `lib/Service/AppointmentBackend/JccBackend.php::bookAppointment()` +- `lib/Service/AppointmentBackend/JccBackend.php::cancelAppointment()` +- `lib/Service/AppointmentBackend/JccBackend.php::rescheduleAppointment()` +- `lib/Service/AppointmentBackend/LocalBackend.php::getTimeslots()` +- `lib/Service/AppointmentBackend/LocalBackend.php::bookAppointment()` +- `lib/Service/AppointmentBackend/LocalBackend.php::cancelAppointment()` +- `lib/Service/AppointmentBackend/LocalBackend.php::rescheduleAppointment()` +- `lib/Service/AppointmentBackend/QmaticBackend.php::getTimeslots()` +- `lib/Service/AppointmentBackend/QmaticBackend.php::bookAppointment()` +- `lib/Service/AppointmentBackend/QmaticBackend.php::cancelAppointment()` +- `lib/Service/AppointmentBackend/QmaticBackend.php::rescheduleAppointment()` +- `lib/Service/AppointmentService.php` — 8 methods: `getTimeslots()`, `bookAppointment()`, `cancelAppointment()`, `markNoShow()`, `getAppointmentsForCase()`, `getAppointmentByToken()`, `getBackend()`, `getObjectService()` +- `src/services/appointmentApi.js::listAppointments()` +- `src/services/appointmentApi.js::bookAppointment()` +- `src/services/appointmentApi.js::cancelAppointment()` +- `src/services/appointmentApi.js::markNoShow()` +- `src/services/appointmentApi.js::getTimeslots()` +- `src/views/public/PublicAppointmentPage.vue::formatDateTime()` +- `src/views/public/PublicAppointmentPage.vue::if()` + +### cluster: case-sharing (29 methods) → `/opsx-reverse-spec procest --cluster case-sharing` + +- `lib/BackgroundJob/ShareMaintenanceJob.php::run()` +- `lib/Controller/CaseSharingController.php::listShares()` +- `lib/Controller/CaseSharingController.php::createShare()` +- `lib/Controller/CaseSharingController.php::revokeShare()` +- `lib/Controller/CaseSharingController.php::initiateTransfer()` +- `lib/Controller/CaseSharingController.php::handleTransfer()` +- `lib/Controller/PublicShareController.php::accessShare()` +- `lib/Controller/PublicShareController.php::addComment()` +- `lib/Controller/PublicShareController.php::viewStatus()` +- `lib/Controller/PublicShareController.php::loadCaseData()` +- `lib/Service/CaseSharingService.php` — 11 methods: `generateToken()`, `createTokenShare()`, `createPartnerShare()`, `getSharesByCase()`, `revokeShare()`, `validateToken()`, `getFilteredCaseData()`, `maskBsn()` + 3 more +- `lib/Service/CaseTransferService.php::initiateTransfer()` +- `lib/Service/CaseTransferService.php::acceptTransfer()` +- `lib/Service/CaseTransferService.php::rejectTransfer()` +- `lib/Service/CaseTransferService.php::getObjectService()` +- `src/views/public/PublicCaseView.vue::loadShareData()` +- `src/views/public/PublicCaseView.vue::if()` +- `src/views/public/PublicStatusPage.vue::loadStatus()` +- `src/views/public/PublicStatusPage.vue::if()` + +### cluster: stuf-protocol (29 methods) → `/opsx-reverse-spec procest --cluster stuf-protocol` + +- `lib/Controller/StufController.php` — 10 methods: `zaken()`, `personen()`, `handleSoapMessage()`, `handleZakLk01()`, `handleZakLv01()`, `handleNpsLv01()`, `handleEdcLk01()`, `handleUnknownMessage()` + 2 more +- `lib/Service/StufFieldMappingService.php` — 13 methods: `mapZknToInternal()`, `mapInternalToZkn()`, `mapBgToInternal()`, `mapInternalToBg()`, `stufDateToIso()`, `isoToStufDate()`, `isoToStufDateTime()`, `confidentialityToInternal()` + 5 more +- `lib/Service/StufMessageBuilder.php::buildSoapEnvelope()` +- `lib/Service/StufMessageBuilder.php::buildStuurgegevens()` +- `lib/Service/StufMessageBuilder.php::buildBv01()` +- `lib/Service/StufMessageBuilder.php::buildFo01()` +- `lib/Service/StufMessageBuilder.php::buildSoapFault()` +- `lib/Service/StufMessageBuilder.php::generateUuid()` + +### cluster: multi-tenancy (24 methods) → `/opsx-reverse-spec procest --cluster multi-tenancy` + +- `lib/Controller/TenantController.php::index()` +- `lib/Controller/TenantController.php::create()` +- `lib/Controller/TenantController.php::provision()` +- `lib/Controller/TenantController.php::usage()` +- `lib/Controller/TenantController.php::current()` +- `lib/Controller/TenantController.php::isPlatformAdmin()` +- `lib/Middleware/TenantMiddleware.php::beforeController()` +- `lib/Middleware/TenantMiddleware.php::afterException()` +- `lib/Service/TenantService.php` — 9 methods: `getTenantForUser()`, `getTenantByGroupId()`, `createTenant()`, `provisionTenant()`, `getResourceUsage()`, `isUserInTenant()`, `isPlatformAdmin()`, `slugify()` + 1 more +- `src/services/tenantApi.js` — 7 methods: `listTenants()`, `createTenant()`, `getTenant()`, `updateTenant()`, `provisionTenant()`, `getTenantUsage()`, `getCurrentTenant()` + +### cluster: leges (21 methods) → `/opsx-reverse-spec procest --cluster leges` + +- `lib/Controller/LegesController.php::calculate()` +- `lib/Controller/LegesController.php::recalculate()` +- `lib/Controller/LegesController.php::verrekening()` +- `lib/Controller/LegesController.php::teruggaaf()` +- `lib/Controller/LegesController.php::export()` +- `lib/Service/LegesCalculationService.php` — 10 methods: `calculate()`, `recalculate()`, `calculateVerrekening()`, `calculateTeruggaaf()`, `calculateArtikel()`, `calculateVast()`, `calculatePercentage()`, `calculateStaffel()` + 2 more +- `lib/Service/LegesExportService.php::export()` +- `lib/Service/LegesExportService.php::exportCSV()` +- `lib/Service/LegesExportService.php::exportASCII()` +- `lib/Service/LegesExportService.php::exportXML()` +- `lib/Service/LegesExportService.php::flattenBerekening()` +- `lib/Service/LegesExportService.php::addXmlElement()` + +### cluster: berichtenbox (17 methods) → `/opsx-reverse-spec procest --cluster berichtenbox` + +- `lib/BackgroundJob/BerichtenboxReadStatusJob.php::run()` +- `lib/Controller/BerichtenboxController.php::send()` +- `lib/Controller/BerichtenboxController.php::messages()` +- `lib/Controller/BerichtenboxController.php::poll()` +- `lib/Service/BerichtenboxAdapter/MockAdapter.php::sendMessage()` +- `lib/Service/BerichtenboxAdapter/MockAdapter.php::getReadStatus()` +- `lib/Service/BerichtenboxService.php` — 7 methods: `sendMessage()`, `getMessagesForCase()`, `pollReadStatus()`, `validateBsn()`, `validateMessage()`, `getAdapter()`, `getObjectService()` +- `src/services/berichtenboxApi.js::sendMessage()` +- `src/services/berichtenboxApi.js::listMessages()` +- `src/services/berichtenboxApi.js::getTypeCodes()` +- `src/services/berichtenboxApi.js::pollReadStatus()` + +### cluster: templates (6 methods) → `/opsx-reverse-spec procest --cluster templates` + +- `lib/Controller/TemplateController.php::index()` +- `lib/Controller/TemplateController.php::show()` +- `lib/Controller/TemplateController.php::activate()` +- `lib/Service/TemplateLibraryService.php::listTemplates()` +- `lib/Service/TemplateLibraryService.php::loadTemplate()` +- `lib/Service/TemplateLibraryService.php::activateTemplate()` + +### cluster: dso-intake (2 methods) → `/opsx-reverse-spec procest --cluster dso-intake` + +- `lib/Service/DsoIntakeService.php::processAanvraag()` +- `lib/Service/DsoIntakeService.php::getDeadlineDuration()` + +## Bucket 3 — Surfaced for human triage + +### 3a — possibly broken + +*Skipped this run — `git log -S` heuristic was noisy on a greenfield-over-specs codebase. Every unmatched REQ collapses to 3b with a note.* + +### 3b — never implemented (73 REQs in 19 untouched capabilities) + +*These are REQs in capabilities where **zero** methods landed in Bucket 1. They're likely unimplemented — not just unmatched.* + +#### advice-management (3 REQs) + +- `REQ-001` — Advice request schema +- `REQ-002` — Advice panel on case dashboard +- `REQ-003` — Advice request form + +#### automatic-actions (2 REQs) + +- `REQ-001` — Automatic Action Framework +- `REQ-002` — Action Execution Error Handling + +#### beroep-escalation (5 REQs) + +- `REQ-001` — Beroep Case Type Pre-Seeded Configuration +- `REQ-002` — Beroep Status Types +- `REQ-003` — Escalation from Bezwaar to Beroep +- `REQ-004` — Court Proceedings Document Management +- `REQ-005` — Hoger Beroep Awareness + +#### bezwaar-advisory-committee (2 REQs) + +- `REQ-001` — Advisory Committee Report Schema +- `REQ-002` — Committee Composition Tracking + +#### bezwaar-decision (3 REQs) + +- `REQ-001` — Decision on Objection Schema +- `REQ-002` — Decision Notification +- `REQ-003` — Heroverweging (Full Reconsideration) + +#### bezwaar-hearing (3 REQs) + +- `REQ-001` — Hearing Session Management +- `REQ-002` — Hearing Waiver (Afzien van Hoorrecht) +- `REQ-003` — Hearing Participants and Access Rights + +#### case-location (4 REQs) + +- `REQ-LOC-01` — Case Detail Map Tab +- `REQ-LOC-02` — Location Picker +- `REQ-LOC-03` — Address Display and Reverse Geocoding +- `REQ-LOC-04` — Case Creation Location + +#### deelzaak-support (6 REQs) + +- `REQ-001` — Sub-case creation from parent case +- `REQ-002` — Sub-cases section on parent case detail +- `REQ-003` — Parent case breadcrumb navigation +- `REQ-004` — Sub-case progress roll-up on parent case +- `REQ-005` — Sub-case count in case list +- `REQ-006` — Sub-case deletion protection + +#### enforcement-lhs (4 REQs) + +- `REQ-001` — LHS matrix configuration +- `REQ-002` — Enforcement action schema +- `REQ-003` — Enforcement wizard +- `REQ-004` — Enforcement panel on case dashboard + +#### parafering-dashboard (4 REQs) + +- `REQ-001` — Secretariaat Parafering Overview +- `REQ-002` — Personal Parafering Inbox +- `REQ-003` — Send Parafering Reminder +- `REQ-004` — Voorstel List Navigation + +#### process-step-configuration (2 REQs) + +- `REQ-001` — Process Step CRUD within Workflow +- `REQ-002` — Step-to-Task Mapping at Runtime + +#### procest-case-management (13 REQs) + +- `REQ-001` — 1: Register and schemas MUST be auto-configured on install +- `REQ-002` — 2: Cases list view MUST display paginated, searchable case overview +- `REQ-003` — 3: Case create dialog MUST support type-driven case creation +- `REQ-004` — 4: Case detail view MUST display full case information with related data +- `REQ-005` — 5: Status lifecycle MUST support configurable status flows with mandatory result on closure +- `REQ-006` — 6: Deadline and timing MUST support processing deadlines with extensions +- `REQ-007` — 7: Tasks MUST be manageable within case context +- `REQ-008` — 8: Participants MUST be manageable per case +- `REQ-009` — 9: Activity timeline MUST record all case events +- `REQ-010` — 10: Case type administration MUST support configuring case types +- `REQ-011` — 11: Navigation MUST include all primary views +- `REQ-012` — 12: Dashboard MUST provide overview metrics and quick access +- `REQ-013` — 13: ZGW API compatibility MUST be maintained + +#### role-based-step-routing (3 REQs) + +- `REQ-001` — Role-Based Step Visibility +- `REQ-002` — Role-Based Transition Access +- `REQ-003` — Workflow Inheritance for Role Configuration + +#### status-transition-engine (3 REQs) + +- `REQ-001` — Guard Evaluation Engine +- `REQ-002` — Transition Execution +- `REQ-003` — Available Transitions for Current User + +#### visual-workflow-editor (3 REQs) + +- `REQ-001` — Drag-and-Drop Workflow Canvas +- `REQ-002` — Workflow Editor Validation +- `REQ-003` — Step Configuration Panel + +#### vth-workflow-templates (4 REQs) + +- `REQ-001` — Omgevingsvergunning workflow template +- `REQ-002` — Toezichtzaak workflow template +- `REQ-003` — Handhavingszaak workflow template +- `REQ-004` — VTH workflow template library + +#### workflow-definition-model (5 REQs) + +- `REQ-001` — Workflow Template Data Model +- `REQ-002` — Workflow Step Data Model +- `REQ-003` — Status Transition Data Model +- `REQ-004` — Pre-Seeded Bezwaar Workflow Template +- `REQ-005` — Pre-Seeded Beroep Workflow Template + +#### workflow-import-export (2 REQs) + +- `REQ-001` — Export Workflow Template +- `REQ-002` — Import Workflow Template + +#### zaaktype-versioning (2 REQs) + +- `REQ-001` — Workflow Template Versioning +- `REQ-002` — Case-to-Workflow-Version Binding + +## Bucket 4 — ADR conformance findings + +### missing `@license` in file docblock (13 files) + +- `lib/BackgroundJob/AppointmentReminderJob.php` +- `lib/BackgroundJob/BerichtenboxReadStatusJob.php` +- `lib/Controller/AppointmentController.php` +- `lib/Controller/BerichtenboxController.php` +- `lib/Controller/PublicAppointmentController.php` +- `lib/Service/AppointmentBackend/AppointmentBackendInterface.php` +- `lib/Service/AppointmentBackend/JccBackend.php` +- `lib/Service/AppointmentBackend/LocalBackend.php` +- `lib/Service/AppointmentBackend/QmaticBackend.php` +- `lib/Service/AppointmentService.php` +- `lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php` +- `lib/Service/BerichtenboxAdapter/MockAdapter.php` +- `lib/Service/BerichtenboxService.php` + +### missing `@copyright` in file docblock (13 files) + +Same 13 files — both `@license` and `@copyright` missing together (appointments + berichtenbox clusters). + +### missing `@spec` in file docblock (89 of 89 files) + +Expected — this is exactly what retrofit fixes. Not a separate finding. + +### forbidden debug helpers — 0 hits ✓ + +### direct SQL — 0 files ✓ (ADR-001 compliant) + +## Notes for the human reviewer + +- case-management/spec.md has duplicated REQ blocks (pilot noted lines 63-945 vs 1013-1946). Pre-retrofit cleanup recommended; counted 45 REQ headings but ~22 are unique. +- Frontend (Vue/TS) classification is file-level — every method in a mapped view inherits the capability's first REQ with confidence 0.78 NEEDS-REVIEW. Specific REQ per method requires reading the component body during /opsx-annotate. +- Large ZGW controllers and rules services (ZrcController 39 methods, ZgwService 37, ZgwZrcRulesService 19) are bucketed via explicit file-level overrides to zgw-api-mapping / zgw-business-rules-compliance. Per-method REQ assignment deferred to annotate. +- Bucket 2b cluster 'workflow-import-export' is tentative — a workflow-import-export spec exists (2 REQs) but my classifier kept CaseDefinition* files in 2a until human confirms scope overlap. +- zgw-business-rules-compliance spec only covers ZRC rules (11 REQs). Methods in ZgwDrcRulesService, ZgwZtcRulesService, ZgwBrcRulesService landed in Bucket 2a — they extend the capability but have no matching REQ in the spec. +- Bucket 3b is computed conservatively: only REQs in capabilities that have ZERO Bucket 1 methods are marked unimplemented. REQs in 'touched' capabilities (admin-settings, case-management, etc.) are assumed implemented but not precisely mapped — their specific REQ-to-method assignment is deferred to /opsx-annotate. +- 3a classification disabled — git log -S heuristic was unreliable on this greenfield-over-specs codebase; every untouched REQ collapsed to 3b with a note. diff --git a/openspec/coverage-report.pilot.json b/openspec/coverage-report.pilot.json new file mode 100644 index 00000000..fc5d18af --- /dev/null +++ b/openspec/coverage-report.pilot.json @@ -0,0 +1,197 @@ +{ + "generated_at": "2026-04-20T00:00:00Z", + "app": "procest", + "branch": "fix/header-info-email-phpcs", + "scanner_version": "1-pilot", + "scope": { + "php": "lib/**/*.php (89 files scanned)", + "frontend": "deferred — src/**/*.{vue,ts,js} (184 files) not yet scanned", + "python": "not applicable (procest is PHP)", + "classification_depth": "file-level primary, method-level only for Bucket 1 representative examples" + }, + "req_inventory_summary": { + "total_specs": 46, + "req_numbered_specs": 15, + "req_numbered_count": 183, + "requirement_named_specs": 31, + "requirement_named_count": 160, + "total_requirements": 343, + "notes": "case-management/spec.md has duplicated REQ blocks; treated as 22 unique. Requirement-named specs need synthesized IDs." + }, + "buckets": { + "annotated": [], + "plumbing": [ + {"file": "lib/Dashboard/CasesOverviewWidget.php", "reason": "IWidget boilerplate (getId/Title/Order/IconClass/Url)"}, + {"file": "lib/Dashboard/DeadlineAlertsWidget.php", "reason": "IWidget boilerplate"}, + {"file": "lib/Dashboard/MyTasksWidget.php", "reason": "IWidget boilerplate"}, + {"file": "lib/Dashboard/OverdueCasesWidget.php", "reason": "IWidget boilerplate"}, + {"file": "lib/Dashboard/StalledCasesWidget.php", "reason": "IWidget boilerplate"}, + {"file": "lib/Dashboard/StartCaseWidget.php", "reason": "IWidget boilerplate"}, + {"file": "lib/Dashboard/TaskRemindersWidget.php", "reason": "IWidget boilerplate — note: load() bodies contain real logic and should be Bucket 1 (dashboard#REQ-DASH-015); only getId/Title/etc are plumbing"}, + {"file": "lib/Middleware/ZgwAuthException.php", "reason": "exception class with getStatusCode()"}, + {"file": "lib/Service/AppointmentBackend/AppointmentBackendInterface.php", "reason": "interface declaration only"}, + {"file": "lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php", "reason": "interface declaration only"} + ], + "bucket_1": [ + {"file": "lib/Settings/AdminSettings.php", "capability": "admin-settings", "req": "REQ-ADMIN-001", "methods": ["getForm", "getSection", "getPriority", "getScope"], "confidence": 0.95, "signal": "direct Nextcloud ISettings implementation; spec cites AdminSettings class"}, + {"file": "lib/Sections/SettingsSection.php", "capability": "admin-settings", "req": "REQ-ADMIN-001", "methods": ["getID", "getName", "getPriority", "getIcon"], "confidence": 0.95, "signal": "spec cites SettingsSection class directly"}, + {"file": "lib/Controller/SettingsController.php", "capability": "admin-settings", "req": "REQ-ADMIN-014", "methods": ["getSettings", "updateSettings"], "confidence": 0.82, "needs_review": true, "signal": "settings endpoints but spec is UI-focused"}, + {"file": "lib/Controller/ZrcController.php", "capability": "zgw-api-mapping", "req": "zgw-api-mapping#Requirement-1..6", "methods": ["index", "create", "show", "update", "patch", "destroy"], "confidence": 0.92, "signal": "ZrcController = ZGW Zaakregistratiecomponent; REST verbs match spec"}, + {"file": "lib/Controller/ZtcController.php", "capability": "zgw-api-mapping", "req": "zgw-api-mapping ZTC requirements", "methods": ["(6 CRUD + 6 ZTC-specific publics)"], "confidence": 0.92, "signal": "ZtcController = Zaaktypecatalogus"}, + {"file": "lib/Controller/DrcController.php", "capability": "zgw-api-mapping", "req": "zgw-api-mapping DRC requirements", "methods": ["index", "create", "show", "update", "patch", "destroy", "download", "lock", "unlock", "audittrailIndex", "audittrailShow", "uploadChunk"], "confidence": 0.92, "signal": "DrcController = Documentregistratie"}, + {"file": "lib/Controller/BrcController.php", "capability": "zgw-api-mapping", "req": "zgw-api-mapping BRC requirements", "methods": ["index", "create", "show", "update", "patch", "destroy", "audittrailIndex", "audittrailShow"], "confidence": 0.92, "signal": "BrcController = Besluitregistratie"}, + {"file": "lib/Controller/NrcController.php", "capability": "zgw-api-mapping", "req": "zgw-api-mapping NRC requirements", "methods": "(10 publics)", "confidence": 0.90, "signal": "NRC = Notificatieroutercomponent"}, + {"file": "lib/Controller/AcController.php", "capability": "zgw-api-mapping", "req": "zgw-api-mapping AC requirements", "methods": ["index", "create", "show", "update", "patch", "destroy"], "confidence": 0.88, "signal": "AC = Autorisatiecomponent"}, + {"file": "lib/Service/ZgwService.php", "capability": "zgw-api-mapping", "req": "multiple (needs method-level pass)", "methods": "(36 publics)", "confidence": 0.90, "signal": "central ZGW orchestrator"}, + {"file": "lib/Service/ZgwMappingService.php", "capability": "zgw-api-mapping", "req": "zgw-api-mapping mapping layer", "methods": "(8 publics)", "confidence": 0.88, "signal": "explicit mapping service"}, + {"file": "lib/Repair/LoadDefaultZgwMappings.php", "capability": "zgw-api-mapping", "req": "zgw-api-mapping (seed)", "methods": ["getDefaultMappings"], "confidence": 0.90, "signal": "28 private getXxxMapping helpers inherit the single public REQ tag"}, + {"file": "lib/Controller/MetricsController.php", "capability": "prometheus-metrics", "req": "REQ-PROM-001", "methods": ["index"], "confidence": 0.97, "signal": "direct match — spec explicitly names metrics endpoint"}, + {"file": "lib/Controller/MetricsController.php", "capability": "prometheus-metrics", "req": "REQ-PROM-001, REQ-PROM-002, REQ-PROM-003, REQ-PROM-009", "methods": ["collectMetrics", "getCached", "checkDatabaseHealth", "getCaseCounts", "getOverdueCasesCount", "getCasesCreatedTodayCount", "getTaskCounts", "getOverdueTasksCount"], "confidence": 0.88, "signal": "Pass B — private helpers inherited from index()"}, + {"file": "lib/Controller/HealthController.php", "capability": "prometheus-metrics", "req": "REQ-PROM-004", "methods": ["index"], "confidence": 0.97, "signal": "direct match — REQ-PROM-004 Health Check Endpoint"}, + {"file": "lib/Controller/HealthController.php", "capability": "prometheus-metrics", "req": "REQ-PROM-004", "methods": ["checkDatabase", "checkOpenRegister", "checkFilesystem", "getAppVersion"], "confidence": 0.88, "signal": "Pass B — inherited from index()"}, + {"file": "lib/AppInfo/Application.php", "capability": "procest-app-scaffold", "req": "procest-app-scaffold Scenario 1.1/1.2", "methods": ["register", "boot"], "confidence": 0.93, "signal": "canonical bootstrap class"}, + {"file": "lib/Controller/DashboardController.php", "capability": "procest-app-scaffold", "req": "procest-app-scaffold (Vue SPA entry)", "methods": ["page"], "confidence": 0.90, "signal": "main template route"}, + {"file": "lib/Repair/InitializeSettings.php", "capability": "procest-app-scaffold", "req": "procest-app-scaffold (InitializeSettings repair step)", "methods": ["getName", "run"], "confidence": 0.95, "signal": "spec names class directly"}, + {"file": "lib/Listener/DeepLinkRegistrationListener.php", "capability": "procest-app-scaffold", "req": "procest-app-scaffold (deep link registration)", "methods": ["handle"], "confidence": 0.85, "signal": "spec mentions deep-link integration"}, + {"file": "lib/Controller/ParaferingController.php", "capability": "parafering-actions + parafeerroute-engine", "req": "multiple (needs method-level)", "methods": ["createVoorstel", "startParafering", "executeAction", "getAuditTrail", "getCurrentStep", "overrideRoute"], "confidence": 0.85, "signal": "terminology match on all method names"}, + {"file": "lib/Service/ParaferingService.php", "capability": "parafering-actions + parafeerroute-engine", "req": "multiple", "methods": "(same 7 publics)", "confidence": 0.85, "signal": "service-layer twin"}, + {"file": "lib/Service/ParaferingNotificationService.php", "capability": "parafering-actions", "req": "parafering-actions notifications", "methods": ["notifyStepActivated", "notifyVoorstelReturned", "notifyParaferingReminder"], "confidence": 0.82, "needs_review": true, "signal": "specific REQ needs reading"}, + {"file": "lib/Controller/GisProxyController.php", "capability": "wms-wfs-layers", "req": "REQ-LAYER-03, REQ-LAYER-04", "methods": ["proxy", "capabilities"], "confidence": 0.95, "signal": "direct match"}, + {"file": "lib/Service/GisProxyService.php", "capability": "wms-wfs-layers", "req": "REQ-LAYER-03, REQ-LAYER-04", "methods": ["proxyRequest", "getCapabilities"], "confidence": 0.92, "signal": "service twin"}, + {"file": "lib/Controller/InspectionController.php", "capability": "inspection-checklists", "req": "inspection-checklists requirements", "methods": ["index", "captureLocation", "completeChecklistItem", "addPhoto", "complete"], "confidence": 0.90, "signal": "name match"}, + {"file": "lib/Service/InspectionService.php", "capability": "inspection-checklists", "req": "inspection-checklists requirements", "methods": "(5 publics)", "confidence": 0.88, "signal": "service twin"}, + {"file": "lib/Service/ChecklistService.php", "capability": "inspection-checklists", "req": "inspection-checklists progress/validation", "methods": ["completeItem", "getProgress", "validateCompletion", "getConformitySummary"], "confidence": 0.85, "signal": "verb match"}, + {"file": "lib/Service/MilestoneService.php", "capability": "doorlooptijd-dashboard", "req": "doorlooptijd-dashboard requirements", "methods": ["getMilestones", "getCaseProgress", "markMilestone", "reverseMilestone", "getDurationAnalytics"], "confidence": 0.85, "signal": "milestones = doorloop milestones"}, + {"file": "lib/Controller/MilestoneController.php", "capability": "doorlooptijd-dashboard", "req": "doorlooptijd-dashboard", "methods": ["progress"], "confidence": 0.85, "signal": "name match"}, + {"file": "lib/Repair/SeedBezwaarBeroepData.php", "capability": "vth-case-type-seed", "req": "vth-case-type-seed", "methods": ["getName", "run"], "confidence": 0.92, "signal": "name match"}, + {"file": "lib/Service/SeedDataService.php", "capability": "vth-case-type-seed", "req": "vth-case-type-seed", "methods": ["seedBezwaarBeroepData"], "confidence": 0.92, "signal": "name match"}, + {"file": "lib/BackgroundJob/AppointmentReminderJob.php", "capability": "(none)", "req": "(2b cluster: appointments)", "methods": ["run"], "confidence": null, "signal": "moved to Bucket 2b"} + ], + "bucket_2a": { + "case-management": { + "methods": [ + {"file": "lib/Controller/EmailController.php", "methods": ["send", "sendFromTemplate", "preview", "templates"], "observed_behavior": "case email integration not in existing REQs"}, + {"file": "lib/Service/CaseEmailService.php", "methods": "(8 publics)", "observed_behavior": "outbound email with template rendering per caseType, inbound reply matching by subject"} + ] + }, + "admin-settings": { + "methods": [ + {"file": "lib/Controller/SettingsController.php", "methods": ["(non-UI settings-bag endpoints)"], "observed_behavior": "REQ-ADMIN-* covers UI, not the bare settings-bag API"} + ] + }, + "inspection-checklists": { + "methods": [ + {"file": "lib/Service/InspectionService.php", "methods": ["calculateDistance"], "observed_behavior": "GPS distance helper not specified"} + ] + }, + "zgw-api-mapping": { + "methods": [ + {"file": "lib/Middleware/ZgwAuthMiddleware.php", "methods": "(4 publics + 5 privates)", "observed_behavior": "ZGW scope-based JWT auth not specified in zgw-api-mapping spec"} + ] + } + }, + "bucket_2b": { + "appointments": { + "files": [ + "lib/Controller/AppointmentController.php", + "lib/Controller/PublicAppointmentController.php", + "lib/BackgroundJob/AppointmentReminderJob.php", + "lib/Service/AppointmentService.php", + "lib/Service/AppointmentBackend/AppointmentBackendInterface.php", + "lib/Service/AppointmentBackend/JccBackend.php", + "lib/Service/AppointmentBackend/LocalBackend.php", + "lib/Service/AppointmentBackend/QmaticBackend.php" + ], + "observed_behavior": "Appointment booking with 3 pluggable backends (JCC for municipal self-service, Qmatic for queue management, Local for dev). Book/cancel/reschedule/no-show + public reschedule via token. Nightly reminder job." + }, + "berichtenbox": { + "files": [ + "lib/Controller/BerichtenboxController.php", + "lib/BackgroundJob/BerichtenboxReadStatusJob.php", + "lib/Service/BerichtenboxService.php", + "lib/Service/BerichtenboxAdapter/BerichtenboxAdapterInterface.php", + "lib/Service/BerichtenboxAdapter/MockAdapter.php" + ], + "observed_behavior": "Sends citizen messages to Dutch government MijnOverheid Berichtenbox with BSN validation; polls read status via adapter pattern." + }, + "case-sharing": { + "files": [ + "lib/Controller/CaseSharingController.php", + "lib/Controller/PublicShareController.php", + "lib/BackgroundJob/ShareMaintenanceJob.php", + "lib/Service/CaseSharingService.php", + "lib/Service/CaseTransferService.php" + ], + "observed_behavior": "Tokenized public-read links for cases, partner shares with filtered case data, case transfer between users/orgs with accept/reject workflow." + }, + "stuf-protocol": { + "files": [ + "lib/Controller/StufController.php", + "lib/Service/StufFieldMappingService.php", + "lib/Service/StufMessageBuilder.php" + ], + "observed_behavior": "Bidirectional SOAP-based StUF-ZKN / StUF-BG protocol mapping — ISO ↔ StUF date formats, confidentiality level mapping, StUF message construction for legacy ZGW clients." + }, + "leges": { + "files": [ + "lib/Controller/LegesController.php", + "lib/Service/LegesCalculationService.php", + "lib/Service/LegesExportService.php" + ], + "observed_behavior": "Tax/fee calculation with 5 strategies (vast, percentage, staffel, maximum, combinatie), recalculation on case changes, verrekening (offset) + teruggaaf (refund) paths, exports to CSV/ASCII/XML." + }, + "ai-assistant": { + "files": [ + "lib/Controller/AiController.php", + "lib/Service/AiService.php" + ], + "observed_behavior": "Case-scoped AI: document classification, data extraction, Q&A, summarization, routing suggestion, next-step suggestion. PII stripping, audit trail, per-feature enable flags." + }, + "multi-tenancy": { + "files": [ + "lib/Controller/TenantController.php", + "lib/Middleware/TenantMiddleware.php", + "lib/Service/TenantService.php" + ], + "observed_behavior": "Tenant resolution on requests, tenant-scoped CRUD, per-controller tenant enforcement." + }, + "templates": { + "files": [ + "lib/Controller/TemplateController.php", + "lib/Service/TemplateLibraryService.php" + ], + "observed_behavior": "Template library for case-type configurations (separate from email templates)." + }, + "dso-intake": { + "files": ["lib/Service/DsoIntakeService.php"], + "observed_behavior": "Receives DSO (Digitaal Stelsel Omgevingswet) aanvraag messages and converts to internal cases." + } + }, + "bucket_3a": [], + "bucket_3b": [], + "bucket_4": { + "missing-spec-in-file-docblock": { + "count": 89, + "note": "expected — this is what retrofit fixes; subsumed by Bucket 1/2 work" + } + } + }, + "ignored": 0, + "notes": [ + "case-management/spec.md has duplicated REQ blocks (lines 63-945 and 1013-1946) — pre-retrofit cleanup recommended.", + "ZrcController is large (17 publics + 22 privates) — chunked annotation by method-group recommended.", + "Requirement-named spec dialect (31 specs, 160 reqs) needs synthesized REQ-IDs; confidence scores for these will run lower.", + "Vue/TS frontend (184 files) not scanned in this pass — follow-up scan required.", + "Consultation cluster likely maps to advice-management (2a, not 2b) — verify before reverse-spec run.", + "NotificatieService likely covered by zgw-api-mapping NRC requirements (2a, not 2b) — verify.", + "case-definition-export-import may overlap workflow-import-export spec (2a, not 2b) — verify.", + "Bucket 3 reverse pass deferred — requires full REQ-to-method coverage map before it's meaningful." + ], + "suggested_next_steps": [ + "Review this report; flag any Bucket 1 matches that look wrong.", + "Decide 2a vs 2b for borderline clusters (consultation, notifications, case-definition-export-import).", + "Decide sequencing for reverse-spec passes — start with self-contained clusters (leges, stuf-protocol).", + "Schedule Vue scan follow-up — same skill, wider glob.", + "/opsx-annotate procest — will create retrofit-annotate-procest-2026-04-20 ghost change." + ] +} diff --git a/openspec/coverage-report.pilot.md b/openspec/coverage-report.pilot.md new file mode 100644 index 00000000..f8a27752 --- /dev/null +++ b/openspec/coverage-report.pilot.md @@ -0,0 +1,260 @@ +# Coverage Report — procest + +Generated: 2026-04-20 (manual pilot run) +Branch: `fix/header-info-email-phpcs` (46 specs present; matches `development`) +Scanner: opsx-coverage-scan v1 (pilot pass — manual execution by Claude Opus) + +## Pilot scope note + +This first pilot pass covers **PHP `lib/` only** (89 files). The Vue/TypeScript frontend (184 files under `src/`) is deferred to a follow-up scan — the file-level classification heuristics are the same, but the volume would blow this run's context budget. + +Additionally, classification was done at **file level** with per-method detail only for Bucket 1 examples. A full per-method pass for all 89 files is the natural next step; the bucket assignments below should be stable under that pass. + +Ignored: 0 (no `.opsx-ignore` present). + +## Summary + +| Bucket | Count | Next action | +|---|---|---| +| annotated | 0 methods / 0 files | — (nothing annotated yet — fully legacy) | +| plumbing | ~50 methods across 7 Dashboard widgets + middleware boilerplate | — (never tagged) | +| 1 — REQ matched | ~180 method-level candidates across 47 files | `/opsx-annotate procest` | +| 2a — existing capability, no REQ | ~40 methods across 9 clusters | `/opsx-reverse-spec procest --extend ` | +| 2b — no capability owner | ~60 methods across 8 clusters | `/opsx-reverse-spec procest --cluster ` | +| 3a — REQ broken | 0 surfaced (heuristic disabled for first-pass retrofit — no annotation history to grep against) | — | +| 3b — REQ never implemented | TBD — blocked on full REQ matching pass | Follow-up | +| 4 — ADR conformance | ~89 files flagged missing `@spec` in docblock (expected — that's what retrofit fixes) | — (subsumed by retrofit) | + +## REQ inventory (summary) + +46 spec directories scanned. Two format dialects: + +- **REQ-numbered** (15 specs, 183 REQs) — e.g. `REQ-ADMIN-001`, `REQ-CM-01`, `REQ-PROM-003` +- **Requirement-named** (31 specs, 160 requirements) — e.g. `### Requirement: Advice request schema` under `advice-management`. Scanner will synthesize `{capability}#REQ-NNN` IDs based on occurrence order. + +**Note on case-management/spec.md**: the file contains each REQ twice (lines 63–945 and 1013–1946). The second block appears to be a duplicate of the first. Flagged as a spec-cleanup follow-up; for retrofit purposes treat as 22 distinct REQs (REQ-CM-01 through REQ-CM-22, plus REQ-CM-23 which appears only in the second block). + +## Bucket 1 — Ready to annotate (representative examples) + +Will be annotated via ghost change `retrofit-annotate-procest-2026-04-20/tasks.md`. + +### capability: admin-settings → tasks 1–15 + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| lib/Settings/AdminSettings.php | getForm(), getSection(), getPriority(), getScope() | REQ-ADMIN-001 | 0.95 | direct Nextcloud ISettings implementation; spec explicitly cites AdminSettings class | +| lib/Sections/SettingsSection.php | getID(), getName(), getPriority(), getIcon() | REQ-ADMIN-001 | 0.95 | spec cites SettingsSection class directly | +| lib/Controller/SettingsController.php | getSettings(), updateSettings() | REQ-ADMIN-014 (validation), REQ-ADMIN-015 (error scenarios) | 0.82 | NEEDS-REVIEW — settings endpoints but spec is UI-focused | + +### capability: zgw-api-mapping → tasks (multiple) + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| lib/Controller/ZrcController.php | index(), create(), show(), update(), patch(), destroy() (6 of 17 publics) | zgw-api-mapping#Requirement-1 through #Requirement-6 (ZRC CRUD) | 0.92 | ZrcController = ZGW Zaakregistratiecomponent; method names = REST verbs matching spec | +| lib/Controller/ZtcController.php | index(), create(), show(), update(), patch(), destroy() | zgw-api-mapping ZTC requirements | 0.92 | ZtcController = ZGW Zaaktypecatalogus | +| lib/Controller/DrcController.php | index(), create(), show(), update(), patch(), destroy(), download(), lock(), unlock() | zgw-api-mapping DRC requirements | 0.92 | DrcController = ZGW Documentregistratie | +| lib/Controller/BrcController.php | index(), create(), show(), update(), patch(), destroy(), audittrailIndex(), audittrailShow() | zgw-api-mapping BRC requirements | 0.92 | BrcController = ZGW Besluitregistratie | +| lib/Controller/NrcController.php | 10 public methods | zgw-api-mapping NRC requirements | 0.90 | NRC = Notificatieroutercomponent | +| lib/Controller/AcController.php | index(), create(), show(), update(), patch(), destroy() | zgw-api-mapping AC requirements | 0.88 | AC = Autorisatiecomponent | +| lib/Service/ZgwService.php | 36 public methods | zgw-api-mapping (multiple) | 0.90 | central ZGW orchestrator; REQ-by-REQ mapping needed in annotate pass | +| lib/Service/ZgwMappingService.php | 8 public methods | zgw-api-mapping | 0.88 | explicit mapping-layer service | +| lib/Repair/LoadDefaultZgwMappings.php | getDefaultMappings() + 28 getXxxMapping() helpers | zgw-api-mapping (seed) | 0.90 | all private helpers inherit the single public REQ tag | + +### capability: prometheus-metrics → tasks 1–10 + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| lib/Controller/MetricsController.php | index() | REQ-PROM-001 (Metrics Endpoint) | 0.97 | direct match | +| lib/Controller/MetricsController.php | private helpers (collectMetrics, getCached, checkDatabaseHealth, getCaseCounts, etc.) | REQ-PROM-001, REQ-PROM-002, REQ-PROM-003, REQ-PROM-009 (caching) | 0.88 | Pass B inherited from index() caller | +| lib/Controller/HealthController.php | index() | REQ-PROM-004 (Health Check Endpoint) | 0.97 | direct match | +| lib/Controller/HealthController.php | checkDatabase(), checkOpenRegister(), checkFilesystem(), getAppVersion() | REQ-PROM-004 | 0.88 | Pass B inherited | + +### capability: case-management → tasks 1–22 + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| lib/Controller/ZrcController.php | 11 additional `public` methods beyond CRUD (e.g. status changes, extensions, suspension, sub-cases) | REQ-CM-14 (status change), REQ-CM-16 (deadline extension), REQ-CM-17 (suspension), REQ-CM-18 (sub-cases) | 0.78 | NEEDS-REVIEW — behavior tag spread; need to read method bodies to map each to exact REQ | +| lib/Service/MilestoneService.php | getMilestones(), getCaseProgress(), markMilestone(), reverseMilestone(), getDurationAnalytics() | doorlooptijd-dashboard requirements | 0.85 | milestones = doorloop milestones | + +### capability: procest-app-scaffold → tasks (multiple) + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| lib/AppInfo/Application.php | register(), boot() | procest-app-scaffold Scenario 1.1 / 1.2 (app registration + enable) | 0.93 | canonical bootstrap class | +| lib/Controller/DashboardController.php | page() | procest-app-scaffold (Vue SPA entry) | 0.90 | main template route | +| lib/Repair/InitializeSettings.php | getName(), run() | procest-app-scaffold (InitializeSettings repair step cited in spec scenario) | 0.95 | spec names this class directly | +| lib/Listener/DeepLinkRegistrationListener.php | handle() | procest-app-scaffold (deep link registration) | 0.85 | spec mentions deep-link integration | + +### capability: parafering-* (5 specs: parafeerroute-engine, parafering-actions, parafering-audit-trail, parafering-dashboard, voorstel-management) + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| lib/Controller/ParaferingController.php | 7 publics (createVoorstel, startParafering, executeAction, getAuditTrail, getCurrentStep, overrideRoute) | parafering-actions + parafeerroute-engine requirements | 0.85 | terminology match on all method names | +| lib/Service/ParaferingService.php | same 7 publics | same | 0.85 | service-layer twin | +| lib/Service/ParaferingNotificationService.php | notifyStepActivated, notifyVoorstelReturned, notifyParaferingReminder | parafering-actions (notifications) | 0.82 | NEEDS-REVIEW — specific REQ needs reading | + +### capability: wms-wfs-layers → tasks 1–4 + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| lib/Controller/GisProxyController.php | proxy(), capabilities() | REQ-LAYER-03 (GIS Proxy), REQ-LAYER-04 (GetCapabilities Parser) | 0.95 | direct match | +| lib/Service/GisProxyService.php | proxyRequest(), getCapabilities() | same | 0.92 | service twin | + +### capability: inspection-checklists + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| lib/Controller/InspectionController.php | index(), captureLocation(), completeChecklistItem(), addPhoto(), complete() | inspection-checklists requirements | 0.90 | name match | +| lib/Service/InspectionService.php | same behaviors | same | 0.88 | service twin | +| lib/Service/ChecklistService.php | completeItem(), getProgress(), validateCompletion(), getConformitySummary() | inspection-checklists (progress/validation) | 0.85 | verb match | + +### capability: openregister-integration + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| (cross-cutting — all `$this->openRegisterObjectService` calls) | — | REQ-OREG-005 (Object Store Pattern) | 0.80 | NEEDS-REVIEW — this is a pattern rather than a method-specific REQ. Annotating EVERY OpenRegister call would over-tag. Recommendation: annotate only the primary integration points (Application.php boot, repair steps) at file level; let the pattern itself be implicit. | + +### capability: vth-case-type-seed + +| File | Method | REQ | Confidence | Signal | +|---|---|---|---|---| +| lib/Repair/SeedBezwaarBeroepData.php | run() | vth-case-type-seed requirements | 0.92 | name match | +| lib/Service/SeedDataService.php | seedBezwaarBeroepData() | same | 0.92 | name match | + +(Full enumeration continues — roughly 180 method-level Bucket 1 candidates across 47 files once finalized.) + +## Bucket 2a — Existing capability, no REQ (reverse-spec --extend) + +Clusters where file path points at a known capability but the observed behavior isn't covered by any existing REQ: + +### cluster: case-management (8 methods) → `/opsx-reverse-spec procest --extend case-management` +- lib/Controller/DashboardController.php::page() — actually plumbing; no extension needed +- lib/Controller/EmailController.php::send(), sendFromTemplate(), preview(), templates() — case email integration not in existing REQs +- lib/Service/CaseEmailService.php — 8 publics, none covered +- **Observed behavior**: Cases can send outbound email, render from templates per caseType, and process inbound replies matched back to cases by subject line. + +### cluster: admin-settings (2 methods) → `--extend admin-settings` +- lib/Controller/SettingsController.php::getCustomSettings(), setCustomSetting() — REQ-ADMIN-* covers the UI but not the settings-bag API + +### cluster: case-types (0 — existing REQs cover CRUD; any gaps need reading) + +### cluster: dashboard (0 — appears covered) + +### cluster: task-management (0 — appears covered) + +### cluster: roles-decisions (0 — appears covered) + +### cluster: inspection-checklists (2 methods) → `--extend inspection-checklists` +- lib/Service/InspectionService.php::calculateDistance() — GPS distance helper not specified + +### cluster: zgw-api-mapping (6 methods) → `--extend zgw-api-mapping` +- lib/Middleware/ZgwAuthMiddleware.php — 4 publics + 5 privates — ZGW scope-based auth not specified explicitly; needs REQs for auth contract +- lib/Middleware/TenantMiddleware.php — tenant resolution on ZGW endpoints + +### cluster: procest-app-scaffold (3 methods) → `--extend procest-app-scaffold` +- lib/Middleware/TenantMiddleware.php::beforeController(), afterException() — covered by multi-tenancy if that spec exists +- (move to 2b cluster "multi-tenancy" if no tenant spec) + +## Bucket 2b — No capability owner (reverse-spec --cluster) + +Clusters with no capability owner — would require a new spec if retrofitted: + +### cluster: appointments (3 files, ~15 methods) → `--cluster appointments` +- lib/Controller/AppointmentController.php (6 publics) +- lib/Controller/PublicAppointmentController.php (3 publics) +- lib/BackgroundJob/AppointmentReminderJob.php +- lib/Service/AppointmentService.php (7 publics) +- lib/Service/AppointmentBackend/* (interface + 3 backends: JCC, Local, Qmatic) +- **Observed behavior**: Appointment booking with 3 pluggable backends (JCC for municipal self-service, Qmatic for queue management, Local for dev). Supports book/cancel/reschedule/no-show + public reschedule via token. Nightly reminder job. + +### cluster: berichtenbox (2 files, ~8 methods) → `--cluster berichtenbox` +- lib/Controller/BerichtenboxController.php +- lib/BackgroundJob/BerichtenboxReadStatusJob.php +- lib/Service/BerichtenboxService.php + adapter interface + MockAdapter +- **Observed behavior**: Sends citizen messages to Dutch government MijnOverheid Berichtenbox with BSN validation; polls read status via adapter pattern. + +### cluster: case-sharing (4 files, ~15 methods) → `--cluster case-sharing` +- lib/Controller/CaseSharingController.php +- lib/Controller/PublicShareController.php +- lib/BackgroundJob/ShareMaintenanceJob.php +- lib/Service/CaseSharingService.php (9 publics) +- lib/Service/CaseTransferService.php (4 publics) +- **Observed behavior**: Generate tokenized public-read links for cases, partner shares with filtered case data, case transfer workflow between users/orgs with accept/reject. + +### cluster: stuf-protocol (2 files, ~20 methods) → `--cluster stuf-protocol` +- lib/Controller/StufController.php (3 publics + 8 privates) +- lib/Service/StufFieldMappingService.php (12 publics) +- lib/Service/StufMessageBuilder.php (6 publics) +- **Observed behavior**: Bidirectional SOAP-based StUF-ZKN / StUF-BG protocol mapping — ISO ↔ StUF date formats, confidentiality level mapping, StUF message construction for legacy ZGW clients. + +### cluster: leges (3 files, ~10 methods) → `--cluster leges` +- lib/Controller/LegesController.php +- lib/Service/LegesCalculationService.php +- lib/Service/LegesExportService.php +- **Observed behavior**: Tax/fee calculation with 5 strategies (vast, percentage, staffel, maximum, combinatie), recalculation on case changes, verrekening (offset) + teruggaaf (refund) paths, exports to CSV/ASCII/XML. + +### cluster: ai-assistant (2 files, ~25 methods) → `--cluster ai-assistant` +- lib/Controller/AiController.php (12 publics) +- lib/Service/AiService.php (12 publics + 10 private prompt builders) +- **Observed behavior**: Case-scoped AI: document classification, data extraction, Q&A, summarization, routing suggestion, next-step suggestion. PII stripping, audit trail, per-feature enable flags. + +### cluster: multi-tenancy (2 files, ~10 methods) → `--cluster multi-tenancy` +- lib/Controller/TenantController.php +- lib/Middleware/TenantMiddleware.php +- lib/Service/TenantService.php +- **Observed behavior**: Tenant resolution on requests, tenant-scoped CRUD, per-controller tenant enforcement. + +### cluster: templates (1 file, 4 methods) → `--cluster templates` +- lib/Controller/TemplateController.php +- lib/Service/TemplateLibraryService.php +- **Observed behavior**: Template library for case-type configurations (separate from email templates). + +### cluster: case-definition-export-import (2 files) → `--cluster case-definition-export-import` +- lib/Controller/CaseDefinitionController.php (export, validate, import) +- lib/Service/CaseDefinitionExportService.php +- lib/Service/CaseDefinitionImportService.php +- **NOTE**: `workflow-import-export` spec exists — might be 2a, not 2b. Needs reading to confirm scope overlap. + +### cluster: dso-intake (1 file) → `--cluster dso-intake` +- lib/Service/DsoIntakeService.php (processAanvraag, getDeadlineDuration) +- **Observed behavior**: Receives DSO (Digitaal Stelsel Omgevingswet) aanvraag messages and converts to internal cases. + +### cluster: consultation (1 file) → possibly 2a under `advice-management` +- lib/Controller/ConsultationController.php + lib/Service/ConsultationService.php +- **NOTE**: Overlap with `advice-management` spec — probably 2a (--extend advice-management). + +### cluster: notifications (1 file) → possibly 2a under `zgw-api-mapping` NRC +- lib/Service/NotificatieService.php +- **NOTE**: Likely covered by NRC requirements in zgw-api-mapping. + +## Bucket 3 — Unimplemented REQs + +**3a and 3b deferred** — detecting REQs whose code "used to exist but is now broken" requires a keyword-based grep over git history that I haven't run yet (would take a separate pass). For an app built greenfield over specs, 3a is unlikely. 3b will show up once I do a systematic "which REQ has zero matched methods" reverse check against the full inventory. + +## Bucket 4 — ADR conformance findings + +### missing-`@spec`-in-file-docblock (89 of 89 files) +Expected — this is exactly what retrofit fixes. Not a separate finding during retrofit. + +### forbidden-patterns scan +Not run in this pilot. Should be done via the existing `/hydra-gate-forbidden-patterns` skill, which has a word-boundary grep already tuned. + +### hardcoded-strings scan +Not run in this pilot — needs separate pass over Vue (skipped). + +## Notes for the human reviewer + +- **case-management/spec.md has duplicated REQ blocks** (lines 63–945 and 1013–1946). Pre-retrofit cleanup recommended — treating as 22 unique REQs for now. +- **ZrcController is large** (17 publics + 22 privates) — many are ZGW CRUD (Bucket 1) but ~11 are `case-management` behaviors that need careful REQ mapping during annotate. Good candidate for chunked annotation by method-group. +- **The 2b clusters are large.** 8 clusters × ~5 REQs each ≈ 40+ reverse-spec REQs. With the 5-REQ-per-run cap, that's 8–10 PRs of reverse-spec work. Sequencing matters: do the independent clusters first (leges, stuf-protocol, templates) before the ones that might overlap or merge (consultation → advice-management, notifications → zgw-api-mapping). +- **The "Requirement-named" spec dialect (31 specs, 160 requirements)** is the bigger matching challenge. These don't have REQ-IDs in the spec file — the scanner needs to synthesize them. Confidence scores for these will run lower than for REQ-numbered specs until the synthesis is stable. +- **Vue/TS frontend (184 files) not scanned.** Likely dominated by `src/views/cases/*.vue` (case-management), `src/views/settings/*.vue` (admin-settings), `src/components/**` (many capabilities). Frontend scan is a natural follow-up; will land in a separate Bucket-1-rich PR. +- **No existing `@spec` annotations** — procest is fully legacy. Expected; confirms the retrofit premise. + +## Suggested next steps (for the human driving the retrofit) + +1. Review this report. Flag any Bucket 1 matches that look wrong. +2. Decide on 2a vs 2b for the borderline clusters: `consultation` (→ advice-management?), `notifications` (→ zgw-api-mapping?), `case-definition-export-import` (→ workflow-import-export?). +3. Decide sequencing for reverse-spec passes. Recommend starting with `leges` or `stuf-protocol` — self-contained, well-defined behaviors that make good dogfood. +4. Schedule a Vue scan follow-up — same skill, wider glob. +5. `/opsx-annotate procest` against this report when ready. Will create ghost change `retrofit-annotate-procest-2026-04-20` and land the Bucket 1 annotations as one PR. From 51edd5332ce75c2fd3371dedd426dbfe471b569d Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 20 Apr 2026 11:17:37 +0200 Subject: [PATCH 4/6] chore: add Greenmail dev docs + sync translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docs/development.md: document local Greenmail setup for mail-driven flows (case intake from citizen email, behandelaar notifications). Includes IMAP/SMTP config + seed-mail.sh pointer to the shared openregister stack. - l10n: sync en/nl strings — add "All cases active", "Case Map", "Cases by status"; drop 4 stale case-type template strings. --- docs/development.md | 25 +++++++++++++++++++++++++ l10n/en.js | 4 ---- l10n/en.json | 4 ---- l10n/nl.js | 5 +---- l10n/nl.json | 19 +++++++++++++++---- 5 files changed, 41 insertions(+), 16 deletions(-) diff --git a/docs/development.md b/docs/development.md index ceec2870..ad6c6305 100644 --- a/docs/development.md +++ b/docs/development.md @@ -143,3 +143,28 @@ git push -u origin feature/my-feature # Open a PR to development ``` + +## Local Mail Integration (Greenmail) + +Procest's mail-driven flows (case intake from citizen emails, notifications to behandelaars) can be demoed locally against the [Greenmail](https://greenmail-mail-test.github.io/greenmail/) container that ships with the OpenRegister dev stack. + +**Seed test data:** +```bash +bash ../openregister/docker/mail/seed-mail.sh +``` + +This sends 11 realistic Dutch case-management emails (omgevingsvergunning, kapvergunning, welstandsadvies, klachten, deadline-herinneringen) across 5 auto-created accounts — all explicitly tagged as procest/pipelinq-relevant scenarios. + +**Configure the Nextcloud Mail app** (Settings → Mail → Add account → Manual): + +| Setting | Value | +|---------|-------| +| IMAP host | `greenmail` (from container) or `localhost` (from host) | +| IMAP port | `3143` | +| SMTP host | same as IMAP | +| SMTP port | `3025` | +| Security | None | +| Username | email address (e.g. `behandelaar@test.local`) | +| Password | same as username | + +Accounts created by the seed: `admin@test.local`, `behandelaar@test.local`, `coordinator@test.local`, `burger@test.local`, `leverancier@test.local`. diff --git a/l10n/en.js b/l10n/en.js index 98d51c52..8b7fa22d 100644 --- a/l10n/en.js +++ b/l10n/en.js @@ -44,12 +44,10 @@ OC.L10N.register( "Case Type" : "Case Type", "Case Type Management" : "Case Type Management", "Case Types" : "Case Types", - "Case created with type \" : "Case created with type \", "Case handler" : "Case handler", "Case schema" : "Case schema", "Case sensitive" : "Case sensitive", "Case type" : "Case type", - "Case type \" : "Case type \", "Case type has expired (valid until {date})" : "Case type has expired (valid until {date})", "Case type is not yet valid (valid from {date})" : "Case type is not yet valid (valid from {date})", "Case type is required" : "Case type is required", @@ -274,8 +272,6 @@ OC.L10N.register( "Started" : "Started", "Status" : "Status", "Status Timeline" : "Status Timeline", - "Status changed from \" : "Status changed from \", - "Status changed to \" : "Status changed to \", "Status schema" : "Status schema", "Status type" : "Status type", "Status type name is required" : "Status type name is required", diff --git a/l10n/en.json b/l10n/en.json index a62343e1..baa6aec7 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -43,12 +43,10 @@ "Case Type": "Case Type", "Case Type Management": "Case Type Management", "Case Types": "Case Types", - "Case created with type \\": "Case created with type \\", "Case handler": "Case handler", "Case schema": "Case schema", "Case sensitive": "Case sensitive", "Case type": "Case type", - "Case type \\": "Case type \\", "Case type has expired (valid until {date})": "Case type has expired (valid until {date})", "Case type is not yet valid (valid from {date})": "Case type is not yet valid (valid from {date})", "Case type is required": "Case type is required", @@ -273,8 +271,6 @@ "Started": "Started", "Status": "Status", "Status Timeline": "Status Timeline", - "Status changed from \\": "Status changed from \\", - "Status changed to \\": "Status changed to \\", "Status schema": "Status schema", "Status type": "Status type", "Status type name is required": "Status type name is required", diff --git a/l10n/nl.js b/l10n/nl.js index 07a3d086..74f4e97d 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -19,6 +19,7 @@ OC.L10N.register( "Add document" : "Document toevoegen", "Add note" : "Notitie toevoegen", "All" : "Alle", + "All cases active" : "Alle zaken actief", "All caught up!" : "Alles bijgewerkt!", "All your items are completed" : "Al uw items zijn afgerond", "Are you sure you want to delete this case?" : "Weet u zeker dat u deze zaak wilt verwijderen?", @@ -44,12 +45,10 @@ OC.L10N.register( "Case Type" : "Zaaktype", "Case Type Management" : "Zaaktype beheer", "Case Types" : "Zaaktypen", - "Case created with type \" : "Zaak aangemaakt met type \", "Case handler" : "Behandelaar", "Case schema" : "Zaak schema", "Case sensitive" : "Hoofdlettergevoelig", "Case type" : "Zaaktype", - "Case type \" : "Zaaktype \", "Case type has expired (valid until {date})" : "Zaaktype is verlopen (geldig tot {date})", "Case type is not yet valid (valid from {date})" : "Zaaktype is nog niet geldig (geldig vanaf {date})", "Case type is required" : "Zaaktype is verplicht", @@ -274,8 +273,6 @@ OC.L10N.register( "Started" : "Gestart", "Status" : "Status", "Status Timeline" : "Status tijdlijn", - "Status changed from \" : "Status gewijzigd van \", - "Status changed to \" : "Status gewijzigd naar \", "Status schema" : "Status schema", "Status type" : "Statustype", "Status type name is required" : "Statustype naam is verplicht", diff --git a/l10n/nl.json b/l10n/nl.json index 90b22c7f..82a645cb 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -18,6 +18,7 @@ "Add document": "Document toevoegen", "Add note": "Notitie toevoegen", "All": "Alle", + "All cases active": "Alle zaken actief", "All caught up!": "Alles bijgewerkt!", "All your items are completed": "Al uw items zijn afgerond", "Are you sure you want to delete this case?": "Weet u zeker dat u deze zaak wilt verwijderen?", @@ -40,15 +41,14 @@ "Cannot publish:": "Kan niet publiceren:", "Case": "Zaak", "Case Information": "Zaak informatie", + "Case Map": "Zakenkaart", "Case Type": "Zaaktype", "Case Type Management": "Zaaktype beheer", "Case Types": "Zaaktypen", - "Case created with type \\": "Zaak aangemaakt met type \\", "Case handler": "Behandelaar", "Case schema": "Zaak schema", "Case sensitive": "Hoofdlettergevoelig", "Case type": "Zaaktype", - "Case type \\": "Zaaktype \\", "Case type has expired (valid until {date})": "Zaaktype is verlopen (geldig tot {date})", "Case type is not yet valid (valid from {date})": "Zaaktype is nog niet geldig (geldig vanaf {date})", "Case type is required": "Zaaktype is verplicht", @@ -57,6 +57,7 @@ "Cases": "Zaken", "Cases and tasks assigned to you will appear here": "Zaken en taken die aan u zijn toegewezen verschijnen hier", "Cases by Status": "Zaken per status", + "Cases by status": "Zaken per status", "Cases overview": "Zaken overzicht", "Change status": "Status wijzigen", "Change status...": "Status wijzigen...", @@ -80,6 +81,7 @@ "Days elapsed": "Dagen verstreken", "Deadline": "Deadline", "Deadline & Timing": "Deadline & Timing", + "Deadline Alerts": "Deadline-waarschuwingen", "Deadline extended from {old} to {new}. Reason: {reason}": "Deadline verlengd van {old} naar {new}. Reden: {reason}", "Deadline: {date}": "Deadline: {date}", "Decision schema": "Besluit schema", @@ -154,6 +156,7 @@ "Make decision": "Besluit nemen", "Manage case types and their configurations": "Beheer zaaktypen en hun configuraties", "Manage cases and workflows": "Beheer zaken en workflows", + "Map": "Kaart", "Mapping saved successfully": "Mapping succesvol opgeslagen", "Missing required fields: {fields}": "Verplichte velden ontbreken: {fields}", "Must be a valid ISO 8601 duration (e.g., P28D)": "Moet een geldige ISO 8601 duur zijn (bijv. P28D)", @@ -174,7 +177,9 @@ "No cases found": "Geen zaken gevonden", "No deadline": "Geen deadline", "No file content received.": "Geen bestandsinhoud ontvangen.", + "No SLA targets": "Geen SLA-doelen", "No items assigned to you": "Geen items aan u toegewezen", + "No items found": "Geen items gevonden", "No mapping configured for %s": "Geen mapping geconfigureerd voor %s", "No open cases": "Geen openstaande zaken", "No overdue cases": "Geen openstaande zaken", @@ -184,6 +189,7 @@ "No result recorded yet": "Nog geen resultaat geregistreerd", "No settings available yet": "Nog geen instellingen beschikbaar", "No status types defined. Add at least one to publish this case type.": "Geen statustypen gedefinieerd. Voeg er ten minste één toe om dit zaaktype te publiceren.", + "No task reminders": "Geen taakherinneringen", "No tasks found": "Geen taken gevonden", "No tasks yet": "Nog geen taken", "No widgets configured": "Geen widgets geconfigureerd", @@ -197,6 +203,7 @@ "Only locked documents may be edited.": "Alleen vergrendelde documenten mogen bewerkt worden.", "Only published case types can be set as default": "Alleen gepubliceerde zaaktypen kunnen als standaard worden ingesteld", "Open Cases": "Open zaken", + "Open cases": "Open zaken", "OpenRegister is required": "OpenRegister is vereist", "Optional description...": "Optionele omschrijving...", "Order": "Volgorde", @@ -252,6 +259,7 @@ "Role type": "Roltype", "Save": "Opslaan", "Save the case type first before adding status types.": "Sla het zaaktype eerst op voordat u statustypen toevoegt.", + "SLA Compliance": "SLA-naleving", "Saved successfully": "Succesvol opgeslagen", "Schema ID": "Schema ID", "Secret": "Geheim", @@ -268,13 +276,12 @@ "Source Register": "Bronregister", "Source Schema": "Bronschema", "Stakeholder": "Belanghebbende", + "Stalled Cases": "Vastgelopen zaken", "Start": "Start", "Start date": "Startdatum", "Started": "Gestart", "Status": "Status", "Status Timeline": "Status tijdlijn", - "Status changed from \\": "Status gewijzigd van \\", - "Status changed to \\": "Status gewijzigd naar \\", "Status schema": "Status schema", "Status type": "Statustype", "Status type name is required": "Statustype naam is verplicht", @@ -283,6 +290,7 @@ "Subject": "Onderwerp", "TASK": "TAAK", "Task": "Taak", + "Task Due Reminders": "Taakherinneringen", "Task Information": "Taak informatie", "Task schema": "Taak schema", "Tasks": "Taken", @@ -317,12 +325,15 @@ "Valid from": "Geldig vanaf", "Valid until": "Geldig tot", "Value Mappings (enum translations)": "Waarde mappings (enum vertalingen)", + "View all": "Alles bekijken", "View all activity": "Alle activiteit bekijken", + "View all deadline alerts": "Alle deadlines bekijken", "View all my work": "Al mijn werk bekijken", "View all overdue": "Alle openstaande bekijken", "View case": "Bekijk zaak", "View task": "Bekijk taak", "Welcome to Procest! Get started by creating your first case or task using the buttons above.": "Welkom bij Procest! Begin door uw eerste zaak of taak aan te maken met de knoppen hierboven.", + "Work Queue": "Werkvoorraad", "Welcome to Procest! Get started by creating your first case type in Settings.": "Welkom bij Procest! Begin door uw eerste zaaktype aan te maken in Instellingen.", "When heeftAlleAutorisaties is false, autorisaties must be specified.": "Wanneer heeftAlleAutorisaties false is, dan moet autorisaties opgegeven worden.", "When heeftAlleAutorisaties is true, autorisaties must not be specified. When heeftAlleAutorisaties is false, autorisaties must be specified.": "Wanneer heeftAlleAutorisaties op true staat, mag autorisaties niet opgegeven worden. Indien heeftAlleAutorisaties false is, dan moet autorisaties opgegeven worden.", From bd9d9929ad5f23bd526416d6f3184ceac6f0231e Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Mon, 20 Apr 2026 17:31:38 +0200 Subject: [PATCH 5/6] fix(i18n): complete Dutch translation coverage for Procest UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Broken l10n/nl.js entries with unescaped quotes caused a JavaScript parse error that silently failed OC.L10N.register(), so ALL Procest translations fell back to English regardless of user language setting. The stale entries were cleaned up in 51edd53; this commit fills in the remaining coverage gaps that made the dashboard appear half-translated. l10n additions (nl.js, en.js, en.json): - Widget titles: Deadline Alerts, Task Due Reminders, Stalled Cases, Case Map, SLA Compliance, Work Queue, Map - Empty states: No items found, No task reminders, All cases active, No SLA targets - Action labels: View all, View all deadline alerts - Lowercase "Open cases" / "Cases by status" aliases to match bundle output Source fixes (require rebuild): - Dashboard.vue: wrap hardcoded 'CASE'/'TASK' badges in t() and pass :empty-label="t(...)" to the 5 CnStatsBlock KPI widgets so their default 'No items found' string becomes translatable - dashboardHelpers.js, doorlooptijdHelpers.js: wrap 'Unknown' fallback strings in t() (imports translate from @nextcloud/l10n) Build config: - webpack.config.js: add scss/sass-loader rule — needed for the new CnCard component from @conduction/nextcloud-vue which uses