*/ public function getAvailableSignatureZones(EntityWorkflow $entityWorkflow): array { $storedObject = $this->entityWorkflowManager->getAssociatedStoredObject($entityWorkflow); if (null === $storedObject) { throw new \RuntimeException('No stored object found'); } if ('application/pdf' !== $storedObject->getType()) { throw new \RuntimeException('Only PDF documents are supported'); } $zones = $this->pdfSignatureZoneParser->findSignatureZones($this->storedObjectManager->read($storedObject)); $signatureZonesIndexes = array_map( fn (EntityWorkflowStepSignature $step) => $step->getZoneSignatureIndex(), $this->collectSignaturesInUse($entityWorkflow) ); return array_values(array_filter($zones, fn (PDFSignatureZone $zone) => !in_array($zone->index, $signatureZonesIndexes, true))); } /** * @return list */ private function collectSignaturesInUse(EntityWorkflow $entityWorkflow): array { return array_reduce($entityWorkflow->getSteps()->toArray(), function (array $result, EntityWorkflowStep $step) { $current = [...$result]; foreach ($step->getSignatures() as $signature) { if (EntityWorkflowSignatureStateEnum::SIGNED === $signature->getState()) { $current[] = $signature; } } return $current; }, []); } }