security->isGranted('ROLE_ADMIN')) { throw new AccessDeniedException('Access denied: ROLE_ADMIN required.'); } $prospect = $this->prospectRepository->findById($id); if (null === $prospect) { throw new InvalidArgumentException(sprintf('Prospect with ID %d not found.', $id)); } if (null === $prospect->getConvertedClient()) { $client = new Client(); $client->setName($prospect->getCompany() ?: (string) $prospect->getName()); $client->setEmail($prospect->getEmail()); $client->setPhone($prospect->getPhone()); $this->entityManager->persist($client); $this->reassignContacts($prospect, $client); $this->reassignAddresses($prospect, $client); $this->reassignReports($prospect, $client); $prospect->setConvertedClient($client); $prospect->setStatus(ProspectStatus::Won); $this->entityManager->flush(); } return json_encode(Serializer::prospect($prospect)); } private function reassignContacts(Prospect $prospect, Client $client): void { foreach ($this->entityManager->getRepository(Contact::class)->findBy(['prospect' => $prospect]) as $contact) { $contact->setClient($client); $contact->setProspect(null); } } private function reassignAddresses(Prospect $prospect, Client $client): void { foreach ($this->entityManager->getRepository(Address::class)->findBy(['prospect' => $prospect]) as $address) { $address->setClient($client); $address->setProspect(null); } } private function reassignReports(Prospect $prospect, Client $client): void { foreach ($this->entityManager->getRepository(CommercialReport::class)->findBy(['prospect' => $prospect]) as $report) { $report->setClient($client); $report->setProspect(null); } } }