src/Controller/DefaultController.php line 95
<?phpnamespace App\Controller;use App\Document\TrapData;use App\Entity\Action;use App\Entity\Address;use App\Entity\Area;use App\Entity\Article;use App\Entity\ArticleCategory;use App\Entity\Contract;use App\Entity\Detergent;use App\Entity\GroundPlan;use App\Entity\GroundPlanTraps;use App\Entity\Log;use App\Entity\MediaObject;use App\Entity\Person;use App\Entity\Project;use App\Entity\Report;use App\Entity\Timesheet;use App\Entity\Trap;use App\Entity\TrapCategory;use App\Entity\TrapQuestion;use App\Entity\TrapScan;use App\Entity\TrapScanTrap;use App\Entity\User;use App\Message\XignalClient;use App\Service\SoapService;use Doctrine\ODM\MongoDB\DocumentManager;use Doctrine\ORM\EntityManagerInterface;use ErrorException;use Psr\Log\LoggerInterface;use Symfony\Bridge\Twig\Mime\TemplatedEmail;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\BinaryFileResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\HttpClient\HttpClient;use Symfony\Component\HttpKernel\Exception\HttpException;use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;use Symfony\Component\HttpKernel\KernelInterface;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;class DefaultController extends AbstractController{private $logger;private $em;private $projectDir;private $userPasswordHasher;private $mailer;private $soap;private $documentManager;private $xignalClient;private $dm;private $apiServer;private $apiPort;private $apiSlug;private $apiUsername;private $apiPassword;private $parameterBag;public function __construct($projectDir,LoggerInterface $logger,EntityManagerInterface $em,UserPasswordHasherInterface $userPasswordHasher,MailerInterface $mailer,SoapService $soap,DocumentManager $documentManager,XignalClient $xignalClient,DocumentManager $dm,ParameterBagInterface $parameterBag) {$this->logger = $logger;$this->em = $em;$this->projectDir = $projectDir;$this->userPasswordHasher = $userPasswordHasher;$this->mailer = $mailer;$this->soap = $soap;$this->documentManager = $documentManager;$this->xignalClient = $xignalClient;$this->dm = $dm;$this->parameterBag = $parameterBag;$this->apiServer = $parameterBag->get('consolit_api_server');$this->apiSlug = $parameterBag->get('consolit_api_slug');$this->apiUsername = $parameterBag->get('consolit_api_username');$this->apiPassword = $parameterBag->get('consolit_api_password');}#[Route(path: '/')]public function home(): Response{return $this->render('base.html.twig');}/*** Corrector for address names*/#[Route('/corrector_address_names', name: 'corrector_address_names')]public function correctorAddressNames(Request $request): Response{// Haal alle adressen op$addresses = $this->em->getRepository(Address::class)->findAll();// Resultaten bijhouden$dryRunResults = [];$totalFound = 0;// Regex patroon voor adresherkenning// Zoekt naar patronen zoals: "straat 123", "1234 AB", "Plaats", etc.$addressPattern = '/\s-\s.*(\d+[a-zA-Z]*\s|\d{4}\s?[A-Z]{2}|straat|weg|laan|plein|singel)/i';// Controleer alle adressenforeach ($addresses as $address) {$name = $address->getName();// Controleer of de naam een streepje bevatif ($name && strpos($name, ' - ') !== false) {// Splits de naam op het eerste streepje$parts = explode(' - ', $name, 2);$afterDash = $parts[1] ?? '';// Sla namen over met "stal" of "PLAEEN" (hoofdletterongevoelig) na het streepjeif (stripos($afterDash, 'stal') !== false || stripos($afterDash, 'PLAEEN') !== false) {continue;}$totalFound++;$newName = trim($parts[0]);// Controleer of het deel na het streepje op een adres lijkt$isLikelyAddress = preg_match($addressPattern, $name);// Voeg toe aan resultaten$dryRunResults[] = ['id' => $address->getId(),'uuid' => $address->getUuid(),'oldName' => $name,'newName' => $newName,'isLikelyAddress' => $isLikelyAddress];}}// Voer de echte update uit als dit is bevestigdif ($request->query->has('confirm') && $request->query->get('confirm') === 'true') {$updatedCount = 0;foreach ($dryRunResults as $result) {$address = $this->em->getRepository(Address::class)->find($result['id']);if ($address) {$address->setName($result['newName']);$updatedCount++;}}$this->em->flush();$html = '<html><body>';$html .= '<h1>Adres Corrector - Live Run</h1>';$html .= '<p>Aantal adressen bijgewerkt: ' . $updatedCount . ' van ' . $totalFound . '</p>';$html .= '<p><a href="/corrector">Terug naar dry run</a></p>';$html .= '</body></html>';return new Response($html);}// Toon de dry run resultaten$html = '<html><body>';$html .= '<h1>Adres Corrector - Dry Run</h1>';$html .= '<p>Totaal aantal adressen met streepje gevonden: ' . $totalFound . '</p>';$html .= '<h2>Alle items (' . count($dryRunResults) . ')</h2>';$html .= '<table border="1" cellpadding="5" style="border-collapse: collapse;">';$html .= '<tr><th>ID</th><th>Oude naam</th><th>Nieuwe naam</th><th>Lijkt op adres?</th></tr>';foreach ($dryRunResults as $result) {$html .= '<tr>';$html .= '<td>' . $result['id'] . '</td>';$html .= '<td>' . htmlspecialchars($result['oldName']) . '</td>';$html .= '<td>' . htmlspecialchars($result['newName']) . '</td>';$html .= '<td>' . ($result['isLikelyAddress'] ? 'Ja' : '<strong style="color: red;">NEE</strong>') . '</td>';$html .= '</tr>';}$html .= '</table>';if (count($dryRunResults) > 0) {$html .= '<p><a href="/corrector?confirm=true" style="background-color: #4CAF50; color: white; padding: 10px 20px; text-decoration: none; display: inline-block; margin-top: 20px;">Voer wijzigingen door</a></p>';}$html .= '</body></html>';return new Response($html);}#[Route('/import_visit_frequency_and_last_visit', name: 'cron_import_visit_frequency_and_last_visit')]public function importVisitFrequencyAndLastVisit(): Response{die(); // comment to enable import function$csvFilePath = 'visit_frequency.csv';if (!file_exists($csvFilePath)) {$this->logger->error("CSV-bestand niet gevonden op {$csvFilePath}");return new Response("CSV-bestand niet gevonden.", Response::HTTP_NOT_FOUND);}$handle = fopen($csvFilePath, 'r');if (!$handle) {$this->logger->error("Kan CSV-bestand niet openen op {$csvFilePath}");return new Response("Kan CSV-bestand niet openen.", Response::HTTP_INTERNAL_SERVER_ERROR);}$updatedCount = 0;// Lees CSV regelswhile (($data = fgetcsv($handle, 1000, ';')) !== false) {$projectId = $data[16] ?? null; // Projectkaart (kolom 17)$eckId = $data[17] ?? null; // Onderdeel (kolom 18)$visitFrequency = $data[14] ?? null; // Normweken (kolom 15)$lastVisitDate = $data[8] ?? null; // Afgewerkt (kolom 9)if (!$projectId || !$eckId || !is_numeric($visitFrequency) || stripos($data[3] ?? '', 'TEST TEST TEST') !== false) {continue;}// Zoek adres op basis van Projectkaart en Onderdeel$addresses = $this->em->getRepository(Address::class)->createQueryBuilder('address')->leftJoin('address.project', 'project')->where('project.projectId = :projectId')->andWhere('address.eckId = :eckId')->andWhere('address.deletedAt IS NULL')->setParameter('projectId', $projectId)->setParameter('eckId', $eckId)->getQuery()->getResult();if (count($addresses)) {foreach ($addresses as $address) {// Stel bezoekfrequentie in$address->setVisitFrequency((int) $visitFrequency);// Parse en stel laatste bezoekdatum inif ($lastVisitDate) {try {$lastVisitDateObj = \DateTime::createFromFormat('d-m-Y H:i', $lastVisitDate);if ($lastVisitDateObj) {$address->setLastVisitDate($lastVisitDateObj);}} catch (\Exception $e) {$this->logger->error("Ongeldige datum in CSV: {$lastVisitDate}");}}$this->em->persist($address);$updatedCount++;}}}fclose($handle);$this->em->flush();$this->logger->info("Import voltooid. {$updatedCount} adressen bijgewerkt.");return new Response("Import voltooid. {$updatedCount} adressen bijgewerkt.");}/*** Importeer adressen vanuit ObjectenContracten CSV bestanden*/#[Route(path: '/addressImporter')]public function addressImporter(Request $request): Response{$csvFiles = [0 => $this->projectDir . 'ObjectenContracten.csv',8 => $this->projectDir . 'ObjectenContracten_essen.csv',];$logs = [];$csvData = [];foreach ($csvFiles as $werkm => $filePath) {if (!file_exists($filePath)) {$logs[] = "<b>CSV-bestand niet gevonden:</b> {$filePath}";continue;}$handle = fopen($filePath, 'r');if (!$handle) {$logs[] = "<b>Kan CSV-bestand niet openen:</b> {$filePath}";continue;}$header = fgetcsv($handle, 0, ';');// Zoek index van eerste kolom 'Onderdeel' (voor eckId)$headerMap = [];$eckIdIndex = null;foreach ($header as $idx => $col) {$colName = trim($col);// Sla alleen de eerste 'Onderdeel' index opif ($colName === 'Onderdeel' && $eckIdIndex === null) {$eckIdIndex = $idx;}$headerMap[$colName] = $idx;}$rowCount = 0;$sampleRows = [];while (($data = fgetcsv($handle, 0, ';')) !== false) {$rowCount++;// Gebruik per werkm de juiste indexen voor projectkaart en eckIdif ($werkm == 8) { // _essen$projectkaart = isset($data[2]) ? trim($data[2]) : null;$eckId = isset($data[3]) ? trim($data[3]) : null;} else { // standaard$projectkaart = isset($data[3]) ? trim($data[3]) : null;$eckId = isset($data[4]) ? trim($data[4]) : null;}if ($projectkaart && $eckId) {$csvData[$werkm][(string)$projectkaart][(string)$eckId] = $data;if (count($sampleRows) < 3) {$sampleRows[] = ['projectkaart' => $projectkaart,'eckId' => $eckId,'row' => $data];}}}fclose($handle);$logs[] = "CSV geladen: <code>{$filePath}</code>, regels ingelezen: <b>{$rowCount}</b>";$logs[] = 'Keys voor werkm ' . $werkm . ': <code>' . htmlspecialchars(json_encode(array_keys($csvData[$werkm] ?? []))) . '</code>';$logs[] = 'Voorbeeld eerste 3 entries werkm ' . $werkm . ': <pre>' . htmlspecialchars(print_r($sampleRows, true)) . '</pre>';}// Find addresses with missing address data (street, housenumber, postal, city)$addresses = $this->em->getRepository(Address::class)->createQueryBuilder('address')->leftJoin('address.project', 'project')->where('address.deletedAt IS NULL')->andWhere('address.street IS NULL OR address.housenumber IS NULL OR address.postal IS NULL OR address.city IS NULL')->getQuery()->getResult();$logs[] = 'Aantal adressen met ontbrekende data: <b>' . count($addresses) . '</b>';$updatedCount = 0;$batchSize = 500;// Inverted dry run: default is dry run, only execute if ?live=1$dryRun = $request->query->get('live', '0') !== '1';$overview = [];foreach ($addresses as $address) {$project = $address->getProject();if (!$project) {$logs[] = 'Adres zonder project: <b>' . (method_exists($address, 'getId') ? $address->getId() : 'onbekend') . '</b>';continue;}$werkm = $project->getWerkm();if (!isset($csvData[$werkm])) {$logs[] = 'Geen CSV data voor werkm: <b>' . $werkm . '</b> (adres ID: <b>' . (method_exists($address, 'getId') ? $address->getId() : 'onbekend') . '</b>)';continue;}$projectkaart = (string)trim($project->getProjectId());$eckId = $address->getEckId();$eckIds = method_exists($address, 'getEckIds') ? $address->getEckIds() : [];$eckIdsList = [];if ($eckId) $eckIdsList[] = $eckId;if (is_array($eckIds)) {foreach ($eckIds as $eid) {if ($eid && !in_array($eid, $eckIdsList, true)) {$eckIdsList[] = $eid;}}}// alles als string getrimd$eckIdsList = array_map(function($v) { return (string)trim($v); }, $eckIdsList);if (!$projectkaart || count($eckIdsList) === 0) {$logs[] = 'Adres zonder projectkaart of eckId(s): <b>' . (method_exists($address, 'getId') ? $address->getId() : 'onbekend') . '</b>';continue;}$row = null;$matchedEckId = null;foreach ($eckIdsList as $tryEckId) {if (isset($csvData[$werkm][$projectkaart][$tryEckId])) {$row = $csvData[$werkm][$projectkaart][$tryEckId];$matchedEckId = $tryEckId;break;}}if (!$row) {$logs[] = 'Geen match in CSV voor werkm: <b>' . $werkm . '</b>, projectkaart: <b>' . htmlspecialchars($projectkaart) . '</b>, eckIds: <b>' . htmlspecialchars(implode(", ", $eckIdsList)) . '</b> (adres ID: <b>' . (method_exists($address, 'getId') ? $address->getId() : 'onbekend') . '</b>)';$logs[] = 'Beschikbare projectkaarten voor werkm ' . $werkm . ': <code>' . htmlspecialchars(json_encode(array_keys($csvData[$werkm] ?? []))) . '</code>';$logs[] = 'Beschikbare eckIds voor projectkaart ' . $projectkaart . ': <code>' . htmlspecialchars(json_encode(array_keys($csvData[$werkm][$projectkaart] ?? []))) . '</code>';continue;}$logs[] = 'Match gevonden voor adres ID: <b>' . (method_exists($address, 'getId') ? $address->getId() : 'onbekend') . '</b> op projectkaart <b>' . htmlspecialchars($projectkaart) . '</b> en eckId <b>' . htmlspecialchars($matchedEckId) . '</b>';$changed = false;$changes = [];// Haal adresvelden op via juiste indexen per werkmif ($werkm == 8) { // _essen$streetIdx = 15;$housenumberIdx = 16;$postalIdx = 17;$cityIdx = 18;} else {$streetIdx = 16;$housenumberIdx = 17;$postalIdx = 18;$cityIdx = 19;}if (!$address->getStreet() && isset($row[$streetIdx]) && trim($row[$streetIdx])) {$changes['street'] = trim($row[$streetIdx]);if (!$dryRun) $address->setStreet(trim($row[$streetIdx]));$changed = true;}if (!$address->getHousenumber() && isset($row[$housenumberIdx]) && trim($row[$housenumberIdx])) {$parsedHousenumber = $this->parseHousenumberToInt(trim($row[$housenumberIdx]));$changes['housenumber'] = $parsedHousenumber;if (!$dryRun) $address->setHousenumber($parsedHousenumber);$changed = true;}if (!$address->getPostal() && isset($row[$postalIdx]) && trim($row[$postalIdx])) {$changes['postal'] = trim($row[$postalIdx]);if (!$dryRun) $address->setPostal(trim($row[$postalIdx]));$changed = true;}if (!$address->getCity() && isset($row[$cityIdx]) && trim($row[$cityIdx])) {$changes['city'] = trim($row[$cityIdx]);if (!$dryRun) $address->setCity(trim($row[$cityIdx]));$changed = true;}if ($changed) {$updatedCount++;// Add to overview for dry run or reporting$overview[] = ['addressId' => method_exists($address, 'getId') ? $address->getId() : null,'projectkaart' => $projectkaart,'eckId' => $eckId,'changes' => $changes,];if (!$dryRun) {$this->em->persist($address);if ($updatedCount % $batchSize === 0) {$this->em->flush();$this->em->clear();}}}}if (!$dryRun) {$this->em->flush();$this->em->clear();}$summary = "Corrector " . ($dryRun ? "(dry run) " : "") . "voltooid. {$updatedCount} adressen " . ($dryRun ? "zouden worden" : "bijgewerkt") . ".";$logs[] = '<b>' . htmlspecialchars($summary) . '</b>';// HTML output with all logs and overview$html = '<!DOCTYPE html><html><head><meta charset="utf-8"><title>Corrector Resultaat</title></head><body>';$html .= '<h2>Corrector Resultaat</h2>';$html .= '<ul>';foreach ($logs as $log) {$html .= '<li>' . $log . '</li>';}$html .= '</ul>';if ($dryRun && count($overview)) {$html .= '<h3>Wijzigingen die zouden worden uitgevoerd:</h3>';$html .= '<table border="1" cellpadding="4" style="border-collapse:collapse"><tr><th>Address ID</th><th>Projectkaart</th><th>EckId</th><th>Changes</th></tr>';foreach ($overview as $row) {$html .= '<tr>';$html .= '<td>' . htmlspecialchars($row['addressId']) . '</td>';$html .= '<td>' . htmlspecialchars($row['projectkaart']) . '</td>';$html .= '<td>' . htmlspecialchars($row['eckId']) . '</td>';$html .= '<td><pre>' . htmlspecialchars(print_r($row['changes'], true)) . '</pre></td>';$html .= '</tr>';}$html .= '</table>';}$html .= '</body></html>';return new Response($html);}/*** Parse a housenumber string to int (returns first integer found, or null if none found)*/private function parseHousenumberToInt(?string $input): ?int{if (is_null($input) || $input === '') return null;if (preg_match('/(\d+)/', $input, $matches)) {return (int)$matches[1];}return null;}#[Route(path: '/adrescheck')]public function adrescheck(): Response{$addresses = $this->em->getRepository(Address::class)->createQueryBuilder('address')->leftJoin('address.project', 'project')->where('address.deletedAt IS NULL')->andWhere('address.street IS NULL OR address.housenumber IS NULL OR address.postal IS NULL OR address.city IS NULL')->getQuery()->getResult();$html = '<!DOCTYPE html><html><head><meta charset="utf-8"><title>Adressen met ontbrekende data</title></head><body>';$html .= '<h2>Adressen met ontbrekende data</h2>';$html .= '<table border="1" cellpadding="4" style="border-collapse:collapse">';$html .= '<tr><th>Address ID</th><th>Projectkaart</th><th>EckId</th><th>Straat</th><th>Huisnummer</th><th>Postcode</th><th>Woonplaats</th></tr>';foreach ($addresses as $address) {$project = $address->getProject();$html .= '<tr>';$html .= '<td>' . htmlspecialchars(method_exists($address, 'getId') ? $address->getId() : '') . '</td>';$html .= '<td>' . htmlspecialchars($project && method_exists($project, 'getProjectId') ? $project->getProjectId() : '') . '</td>';$html .= '<td>' . htmlspecialchars(method_exists($address, 'getEckId') ? $address->getEckId() : '') . '</td>';$html .= '<td>' . htmlspecialchars($address->getStreet()) . '</td>';$html .= '<td>' . htmlspecialchars($address->getHousenumber()) . '</td>';$html .= '<td>' . htmlspecialchars($address->getPostal()) . '</td>';$html .= '<td>' . htmlspecialchars($address->getCity()) . '</td>';$html .= '</tr>';}$html .= '</table>';$html .= '<p>Totaal: <b>' . count($addresses) . '</b> adressen met ontbrekende data.</p>';$html .= '</body></html>';return new Response($html);}#[Route(path: '/corrector_report_scores')]public function correctorReportScores(): Response{$isEnabled = false;$trapQuestions = $this->em->getRepository(TrapQuestion::class)->findAll();$questions = [];foreach ($trapQuestions as $trapQuestion) {if ($trapQuestion->isCountsForScore()) {$questions[] = $trapQuestion->getId();}}if (count($questions) < 1) {return new Response('no questions');}$projects = $this->em->getRepository(Project::class)->findAll();if (!count($projects)) {return new Response('no projects');}foreach ($projects as $project) {$addresses = $this->em->getRepository(Address::class)->findBy(['project' => $project->getId()]);if (count($addresses) < 1) {continue;}$i = 0;foreach ($addresses as $address) {$reports = $this->em->getRepository(Report::class)->findBy(['address' => $address->getId()]);foreach ($reports as $report) {$catches = 0;$trapScans = $this->em->getRepository(TrapScan::class)->findBy(['report' => $report->getId()]);if (count($trapScans) < 1) {continue;}foreach ($trapScans as $scan) {$trapData = $this->dm->createQueryBuilder(TrapData::class)->find()->hydrate(false)->field('trapScan')->equals($scan->getId())->field('trapQuestion')->in($questions)->getQuery()->execute()->toArray();if (count($trapData) < 1) {continue;}foreach ($trapData as $data) {if ($data['value'] && (int) $data['value'] > 0) {$catches = $catches + (int) $data['value'];}}}if ($catches <= 1) {$score = 'green';}if ($catches > 1 && $catches <= 3) {$score = 'orange';}if ($catches > 3) {$score = 'red';}$report->setScore($score);$this->em->persist($report);$i++;if ($isEnabled && ($i % 500 == 0)) {$this->em->flush();}}}}if ($isEnabled) {$this->em->flush();}return new Response('processed ' . $i . ' reports');}#[Route(path: '/start_mqtt_client')]public function startMqttClient(): Response{$this->xignalClient->init();return $this->render('base.html.twig');}#[Route(path: '/send_welcome_mail')]public function sendWelcomeMail(): Response{exit('not enabled');// TODO: Check for createdAt date to not process EVERY user$users = $this->em->getRepository(User::class)->findAll();foreach ($users as $user) {if (0 == count($user->getAddresses()) || 0 == count($user->getProjects()) || in_array('ROLE_EMPLOYEE', $user->getRoles())) {dump('skipping '.$user->getEmail());continue;}// generate password$comb = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';$pass = [];$combLen = strlen($comb) - 1;for ($i = 0; $i < 12; ++$i) {$n = rand(0, $combLen);$pass[] = $comb[$n];}$newPassword = implode($pass);// update password$user->setPassword($this->userPasswordHasher->hashPassword($user, $newPassword));$user->eraseCredentials();$user->setModifiedAt(new \DateTime());$this->em->persist($user);// send emailif (!filter_var($user->getEmail(), FILTER_VALIDATE_EMAIL)) {dump('incorrect email '.$user->getEmail());continue;}try {$message = (new TemplatedEmail());$message->sender('noreply@mailgun.vaneckbv.nl');$message->replyTo('info@vaneckbv.nl');$message->from('Van Eck Bedrijfshygiene <info@vaneckbv.nl>');$message->addTo($user->getEmail());$message->subject('Welkom in ons digitaal logboek');$message->htmlTemplate('Email/welcome.html.twig');$message->context(['user' => $user,'password' => $newPassword,]);$this->mailer->send($message);} catch (ServiceUnavailableHttpException $e) {// throw new ServiceUnavailableHttpException('sending_email_failed');dump($e->getMessage());}}$this->em->flush();return new Response('done');}#[Route(path: '/send_2fa_mail')]public function send2FAMail(): Response{exit('not enabled');$users = $this->em->getRepository(User::class)->findAll();$message = (new TemplatedEmail());$message->sender('noreply@mailgun.vaneckbv.nl');$message->replyTo('info@vaneckbv.nl');$message->from('Van Eck Bedrijfshygiene <info@vaneckbv.nl>');$message->subject('Tweestapsverificatie vereist in het Digitale Logboek per 4 april 2023');$message->htmlTemplate('Email/introducing_2fa.html.twig');$count = 0;foreach ($users as $user) {$count++;if (0 == count($user->getAddresses()) || 0 == count($user->getProjects()) || in_array('ROLE_EMPLOYEE', $user->getRoles())) {continue;}$valid = false;foreach ($user->getAddresses() as $address) {if ($address->getSoapUsername()) {$valid = true;}}foreach ($user->getProjects() as $project) {if ($project->getSoapUsername()) {$valid = true;}}if (!$valid) {continue;}// send emailif (!filter_var($user->getEmail(), FILTER_VALIDATE_EMAIL)) {continue;}try {$message->to($user->getEmail());$message->context(['user' => $user]);$this->mailer->send($message);} catch (ServiceUnavailableHttpException $e) {// throw new ServiceUnavailableHttpException('sending_email_failed');// dump($e->getMessage());}if(($count%100) == 0) {sleep(1);}}return new Response('done');}#[Route(path: '/remove_duplicate_areas', name: 'remove_duplicate_aras', methods: ['GET'])]public function cronRemoveDuplicateAreas(Request $request): Response{exit('DISABLED. COMMENT FIRST LINE TO ENABLE.');$addressId = $request->query->get('address_id');if (!$addressId) {return new Response('no address_id provided');}$areas = $this->em->getRepository(Area::class)->findBy(['address' => $addressId], []);if (!count($areas)) {return new Response('no areas found for address');}$areaToSet = $areas[0];foreach ($areas as $area) {if ($area->getId() === $areaToSet->getId() || $area->getName() !== $areaToSet->getName()) { // also check if is duplicate by namecontinue;}$traps = $this->em->getRepository(Trap::class)->findBy(['area' => $area->getId()]);foreach ($traps as $trap) {$trap->setArea($areaToSet);$this->em->persist($trap);}$this->em->remove($area);$trapData = $this->documentManager->getRepository(TrapData::class)->findBy(['area' => $area->getId()]);foreach ($trapData as $data) {$data->setArea($areaToSet->getId());$this->documentManager->persist($data);}$this->documentManager->flush();$this->em->flush();}return new Response('done');}#[Route(path: '/remove_duplicate_traps', name: 'remove_duplicate_traps', methods: ['GET'])]public function cronRemoveDuplicateTraps(Request $request): Response{// Activeren middels $isLive wanneer er nieuwe dubbele lokazen in de DB staan, vooraf controleren of het script werkt./////////$isLive = false;/////////$addresses = $this->em->getRepository(Address::class)->findBy([], []);foreach ($addresses as $address) {$trapNumbers = [];$trapsR = $this->em->getRepository(Trap::class)->findBy(['address' => $address->getId()]);$traps = [];foreach ($trapsR as $trap) {if ($trap->getArchivedAt() || $trap->getDeletedAt() || !$trap->getArea()) {continue;}$traps[] = $trap;$trapNumbers[] = $trap->getIndentificatie() . '_' . ($trap->getArea() ? $trap->getArea()->getId() : '_no_area');}$duplicates = array_count_values($trapNumbers);$duplicates = array_diff($duplicates, [1]); // only keep duplicates$seenFirst = [];$withTrapData = [];foreach ($duplicates as $trapNumber => $n) {foreach ($traps as $trap) {if ($trap->getIndentificatie() . '_' . ($trap->getArea() ? $trap->getArea()->getId() : '_no_area') != $trapNumber) {continue;}if (in_array($trap->getIndentificatie() . '_' . ($trap->getArea() ? $trap->getArea()->getId() : '_no_area'), $seenFirst)) {$trapData = $this->documentManager->getRepository(TrapData::class)->findBy(['trap' => $trap->getId()]);if (!count($trapData)) {$this->em->remove($trap);$groundPlanTrap = $this->em->getRepository(GroundPlanTraps::class)->findOneBy(['trap' => $trap->getId()]);if ($groundPlanTrap) {$this->em->remove($groundPlanTrap);}echo 'Deleting ID #' . $trap->getId() . ' with indentificatie ' . $trap->getIndentificatie() . ' (' . $trap->getArea()->getName() . ' - ' . $trap->getArea()->getAddress()->getName() .' - ' . $trap->getArea()->getAddress()->getProject()->getName() . ')<br /><br />';} else {echo 'Skipping ID #' . $trap->getId() . ' with indentificatie ' . $trap->getIndentificatie() . ' (' . $trap->getArea()->getName() . ' - ' . $trap->getArea()->getAddress()->getName() .' - ' . $trap->getArea()->getAddress()->getProject()->getName() . ') - Has trapData - Trying to set trapData to sibling<br />';try {$siblingTraps = $this->em->createQueryBuilder()->from(Trap::class, 't')->select('t')->where('t.number = :number')->andWhere('t.indentificatie = :indentificatie')->andWhere('t.area = :area')->andWhere('t.id <> :id')->andWhere('t.deletedAt IS NULL')->setParameter('number', $trap->getNumber())->setParameter('indentificatie', $trap->getIndentificatie())->setParameter('area', $trap->getArea())->setParameter('id', $trap->getId())->getQuery()->getResult();if (count($siblingTraps)) {foreach ($siblingTraps as $siblingTrap) {$siblingTrapData = $this->documentManager->getRepository(TrapData::class)->findOneBy(['trap' => $siblingTrap->getId()]);if (!$siblingTrapData) {echo '-- Sibling with trap ID #' . $siblingTrap->getId() . ' has no associated trapData, deleting this trap object instead<br />';$this->em->remove($siblingTrap);$groundPlanTrap = $this->em->getRepository(GroundPlanTraps::class)->findOneBy(['trap' => $siblingTrap->getId()]);if ($groundPlanTrap) {$this->em->remove($groundPlanTrap);}echo '-- Deleting ID #' . $siblingTrap->getId() . ' with indentificatie ' . $siblingTrap->getIndentificatie() . ' (' . $siblingTrap->getArea()->getName() . ' - ' . $siblingTrap->getArea()->getAddress()->getName() .' - ' . $siblingTrap->getArea()->getAddress()->getProject()->getName() . ')<br /><br />';} else {foreach ($trapData as $data) {$data->setTrap($siblingTrap->getId());$this->documentManager->persist($data);}if ($isLive) {$this->documentManager->flush();}echo '-- Reset trapData to trap ID #' . $siblingTrap->getId() . '<br />';$this->em->remove($trap);$groundPlanTrap = $this->em->getRepository(GroundPlanTraps::class)->findOneBy(['trap' => $trap->getId()]);if ($groundPlanTrap) {$this->em->remove($groundPlanTrap);}echo '-- Deleting ID #' . $trap->getId() . ' with indentificatie ' . $trap->getIndentificatie() . ' (' . $trap->getArea()->getName() . ' - ' . $trap->getArea()->getAddress()->getName() .' - ' . $trap->getArea()->getAddress()->getProject()->getName() . ')<br /><br />';}}} else {echo '-- No sibling traps found for indentificatie ' . $trap->getIndentificatie() . ')<br /><br />';}} catch (\Exception $e) {echo '!!-- Error looking for sibling for trap ' . $trap->getId() . ': <i>' . $e->getMessage() . '</i><br /><br />';}}continue;}$seenFirst[] = $trap->getIndentificatie() . '_' . ($trap->getArea() ? $trap->getArea()->getId() : '_no_area');}}}if ($isLive) {$this->em->flush();}return new Response('done');}#[Route(path: '/lokazen_check')]public function lokazenCheck(): Response{/*$addressIds = [ 5536, 5539, 5540, 4550, 4551 ];$queryBuilder = $this->em->createQueryBuilder()->from(Trap::class, 't')->select('t')->where('v.address IN :addressIds')->setParameter('addressIds', $addressIds);$traps = $queryBuilder->getQuery()->getResult();foreach ($traps as $trap) {if ($trap->getArea()->getAddress() !== $trap->getAddress()) {// location exists for the real address?$area = $this->em->getRepository(Area::class)->findBy(['address' => $trap->getAddress(), 'name' => $trap->getArea()->getName()]);if ($area) {$trap->setArea($area);} else {$area = new Area();$area->setAddress($trap->getAddress());$area->setName($trap->getArea()->getName());$this->em->persist($area);}$trap->setArea($area);$this->em->persist($trap);//$this->em->flush();}}*/return new Response('done');}#[Route(path: '/csv_import')]public function csvImport(): Response{// TODO: 9-11 LIJKT GEREED VOOR IMPORT HYGIENE$werkm = 2;$isLive = false;$i = 0;$counter = 0;$counter2 = 0;$counter3 = 0;$trapcats = [];$errors = [];$res = $this->em->getRepository(TrapCategory::class)->findAll();foreach ($res as $v) {$trapcats[$v->getCode()] = $v;}$eckIds = [];$addresses = $this->em->getRepository(Address::class)->findBy([], []);foreach ($addresses as $address) {if ($address->getProject()->getWerkm() === $werkm) {$eckIds[$address->getEckId()] = $address;echo $address->getId() . ' - ';}}$areas = [];$groundPlans = [];if (($handle = fopen('20231025_Objectenvaneck_H.csv', 'r')) !== false) {while (($cols = fgetcsv($handle, null, ';')) !== false) {$cols = array_map('utf8_encode', $cols);if (0 == $i) {foreach ($cols as $k => $v) {$lookup[$v] = $k;}}/*//// OBJECT MI LOGIN/PASS UPDATEN//if ($i > 0) {if ('A' == substr($cols[2], 0, 1)) {continue;}$projectId = $cols[$lookup['Projectkaart']];$addressId = $cols[$lookup['Onderdeel']];// find or create project$project = $this->em->getRepository(Project::class)->findOneBy(['projectId' => $projectId]);if (!$project) {continue;}$address = $this->em->getRepository(Address::class)->findOneBy(['project' => $project, 'eckId' => $addressId]);if ($address) {if ($cols[$lookup['inlog_debiteur']] && $cols[$lookup['ww_debiteur']]) {$project = $address->getProject();$project->setSoapUsername($cols[$lookup['inlog_debiteur']]);$project->setSoapPassword($cols[$lookup['ww_debiteur']]);$this->em->persist($project);}if ($cols[$lookup['inlog']] && $cols[$lookup['ww']]) {$address->setSoapUsername($cols[$lookup['inlog']]);$address->setSoapPassword($cols[$lookup['ww']]);$this->em->persist($address);}}if (0 == $i % 1000) {$this->em->flush();}++$i;}*//*//// OBJECT CONTACT UPDATEN//if ($i > 0) {if (substr($cols[2], 0, 1) == 'A') {continue;}if ($cols[$lookup['Telecomsoort']] != 'E-mail') {continue;}$projectId = $cols[current($lookup)];// find or create project$project = $this->em->getRepository(Project::class)->findOneBy(['projectId' => $projectId]);if ($project) {if ($cols[$lookup['Nummer']] && strpos($cols[$lookup['Nummer']], '@') !== false) {$project->setEmail($cols[$lookup['Nummer']]);}if ($cols[$lookup['E-mail']] && strpos($cols[$lookup['E-mail']], '@') !== false) {$project->setEmail($cols[$lookup['E-mail']]);}$this->em->persist($project);}if($i % 4000 ==0) {$this->em->flush();}$i++;}*///// LOKAZEN UIT OUDE DATABASE///*if ($i > 0) {$project = $this->em->getRepository(Project::class)->findBy(['projectId' => $cols[$lookup['project_id']]]);if (count($project) == 0) {continue;} else {$project = $project[0];}$address = $this->em->getRepository(Address::class)->findBy([ 'project' => $project->getId(), 'eckId' => $cols[$lookup['eck_id']] ]);if (count($address) == 0) {continue;} else {$address = $address[0];}if (array_key_exists($address->getId().$cols[$lookup['name']], $areas)) {$area = $areas[$address->getId().$cols[$lookup['name']]];} else {$area = $this->em->getRepository(Area::class)->findBy([ 'address' => $address->getId(), 'name' => $cols[$lookup['name']] ]);if (count($area) == 0) {$area = new Area();$area->setName($cols[$lookup['name']]);$area->setAddress($address);$this->em->persist($area);$counter3++;} else {$area = $area[0];}}$areas[$address->getId().$cols[$lookup['name']]] = $area;if (array_key_exists($address->getId().$cols[$lookup['name']], $groundPlans)) {$groundPlan = $groundPlans[$address->getId().$cols[$lookup['name']]];} else {$groundPlan = $this->em->getRepository(GroundPlan::class)->findBy([ 'area' => $area->getId() ]);if (count($groundPlan) == 0) {$media = new MediaObject();$media->setUploadTimestamp(new \DateTime());$media->setFileName($area->getName());$uri = str_replace('/uploads', '/media/2021/07', $cols[$lookup['map']]);$media->setUri($uri);$this->em->persist($media);$groundPlan = new GroundPlan();$groundPlan->setImage($media);$groundPlan->setArea($area);$groundPlan->setDate(new \DateTime());$groundPlan->setName($cols[$lookup['name']]);$this->em->persist($groundPlan);$counter2++;} else {$groundPlan = $groundPlan[0];// re-set all media objects to current uri if first batch went wrong due to MediaObjectAddedListener//$uri = str_replace('/uploads', '/media/2021/07', $cols[$lookup['map']]);//$media = $groundPlan->getImage();//if ($media->getUri() !== $uri) {//$media->setUri($uri);//$this->em->persist($media);//}}}$groundPlans[$address->getId().$cols[$lookup['name']]] = $groundPlan;if (!array_key_exists($cols[$lookup['klasse']], $trapcats)) {$trapCat = new TrapCategory();$trapCat->setName($cols[$lookup['klasse']]);$trapCat->setCode($cols[$lookup['klasse']]);$this->em->persist($trapCat);$this->em->flush();$trapCat[$cols[$lookup['klasse']]] = $trapCat->getId();}$trap = $this->em->getRepository(Trap::class)->findBy([ 'indentificatie' => $cols[$lookup['indentificatie']], 'number' => $cols[$lookup['lokaas_id']], 'address' => $address->getId() ]);if (count($trap) == 0) {$trap = new Trap();$trap->setCategory($trapcats[$cols[$lookup['klasse']]]);$trap->setIndentificatie($cols[$lookup['indentificatie']]);$trap->setNumber($cols[$lookup['lokaas_id']]);$trap->setArea($area);$trap->setAddress($address);$trap->setLocation($cols[$lookup['locatie']]);$this->em->persist($trap);$groundPlanTrap = new GroundPlanTraps();$groundPlanTrap->setGroundPlan($groundPlan);$groundPlanTrap->setPosX($cols[$lookup['pos_x']]);$groundPlanTrap->setPosY($cols[$lookup['pos_y']]);$this->em->persist($groundPlanTrap);$groundPlan->addTrap($groundPlanTrap);$trap->addGroundPlan($groundPlanTrap);$counter++;}if($i % 4000 ==0) {$this->em->flush();}}$i++;*///// OBJECTEN//if ($i > 0) {if (substr($cols[2], 0, 1) == 'A') {continue;}$projectId = $cols[current($lookup)];// find or create contract$contract = $this->em->getRepository(Contract::class)->findBy(['name' => $cols[$lookup['Naam debiteur']]]);if (count($contract) == 0) {$contract = new Contract();$contract->setCreatedAt(new \DateTime());$contract->setName(htmlentities($cols[$lookup['Naam debiteur']]));$contract->setContractId(intval($cols[$lookup['Debiteurnr.']]));//dump('-------- NEW CONTRACT:');//dump($contract);$this->em->persist($contract);if ($isLive) {$this->em->flush();}} else {$contract = $contract[0];//dump($contract);}// find or create project$project = $this->em->getRepository(Project::class)->findBy(['projectId' => $projectId]);if (count($project) == 0) {$project = new Project();$project->setCreatedAt(new \DateTime());$project->setContract($contract);$project->setProjectId(intval($projectId));if ($cols[$lookup['Naam object']]) {$project->setName(htmlentities($cols[$lookup['Naam object']]));} else {$project->setName($contract->getName());}$project->setEmail($cols[$lookup['Nummer']]);$project->setWerkm($werkm);$project->setStreet(htmlentities(ucfirst(strtolower($cols[$lookup['Adres 1']]))));$project->setHousenumber(intval($cols[$lookup['Huisnr.']]));$project->setPostal(strtoupper($cols[$lookup['Postcode']]));$project->setCity(htmlentities(ucfirst(strtolower($cols[$lookup['Woonplaats']]))));$project->setCountry(strtolower($cols[$lookup['Land']]));//dump('-------- NEW PROJECT:');//dump($project);$this->em->persist($project);if ($isLive) {$this->em->flush();}} else {$project = $project[0];//dump($project);}if (array_key_exists(intval($cols[1]), $eckIds)) {$address = $eckIds[intval($cols[1])];if ($address->getId()) {echo $address->getId() . ': ' . $address->getStreet() . ' ' . $address->getHousenumber() . '<br />';}//dump(intval($cols[1]));//dump($address);} else {// create address$address = new Address();$address->setCreatedAt(new \DateTime());$address->setName(htmlentities($cols[$lookup['Omschrijving']]));$address->setProject($project);$address->setEckId(intval($cols[1]));$address->setContract(strtoupper(preg_replace('/[0-9]+/', '', $cols[2])));if ($cols[$lookup['Adres 2']] && strlen((string) $cols[$lookup['Adres 2']] > 0)) {$address->setStreet(ucfirst(htmlentities(strtolower($cols[$lookup['Adres 2']]))));} else {$address->setStreet(ucfirst(htmlentities(strtolower($cols[$lookup['Adres 1']]))));}$address->setHousenumber(intval($cols[$lookup['Huisnr.']]));$address->setPostal(strtoupper($cols[$lookup['Postcode']]));$address->setCity(htmlentities(ucfirst(strtolower($cols[$lookup['Woonplaats']]))));$address->setCountry(substr(strtolower($cols[$lookup['Land']]), 0, 2));$address->setShowTrapAlert(false);$address->setShowMap(false);$address->setEmail(strtolower(trim($cols[$lookup['E-mail']])));//dump('-------- NEW ADDRESS:');//dump($address);$this->em->persist($address);$eckIds[intval($cols[1])] = $address;echo 'NIEUW' . ': ' . $address->getStreet() . ' ' . $address->getHousenumber() . '<br />';}// find or create userif (strtolower(trim($cols[$lookup['E-mail']]))) {$user = $this->em->getRepository(User::class)->findBy(['email' => strtolower(trim($cols[$lookup['E-mail']]))]);if (count($user) == 0) {$user = new User();$user->setCreatedAt(new \DateTime());$user->setEmail(strtolower(trim($cols[$lookup['E-mail']])));$user->setPassword($this->userPasswordHasher->hashPassword($user, 'Eck123'));$user->setLocale(substr(strtolower(trim($cols[$lookup['Land']])), 0, 2));$user->setRoles(['ROLE_CUSTOMER']);$person = new Person();if (strpos(strtolower(htmlentities($cols[$lookup['Contactpersoon']])), 'dhr') !== false) {$person->setGender('m');}if (strpos(strtolower(htmlentities($cols[$lookup['Contactpersoon']])), 'mw') !== false || strpos(strtolower(htmlentities($cols[$lookup['Contactpersoon']])), 'mevr') !== false) {$person->setGender('f');}$name = htmlentities($cols[$lookup['Contactpersoon']]);$name = str_replace('Dhr', '', $name);$name = str_replace('Dhr ', '', $name);$name = str_replace('Dhr.', '', $name);$name = str_replace('Mw', '', $name);$name = str_replace('Mw ', '', $name);$name = str_replace('Mw.', '', $name);$name = explode(' ', $name, 2);$person->setFirstname($name[0]);if (array_key_exists(1, $name)) {$person->setLastname($name[1]);}$person->setPhone($cols[$lookup['Telefoon']]);$person->setEmail(strtolower(trim($cols[$lookup['E-mail']])));$this->em->persist($person);$user->setPerson($person);//dump('-------- NEW USER:');//dump($user);$this->em->persist($user);if ($isLive) {$this->em->flush();}} else {$user = $user[0];//dump($user->getId());}$projectAdded = false;foreach ($user->getProjects() as $project) {if ($project->getId() === $address->getProject()->getId()) {$projectAdded = true;}}if (!$projectAdded) {$user->addProject($project);if ($isLive) {$this->em->flush();}}$user->addAddress($address);$this->em->persist($user);}}if($i % 1000 == 0) {if ($isLive) {$this->em->flush();}}$i++;/*//// SOAP USERNAME + PASSWORDS//if ($i > 0) {$projectId = $cols[0];$eckId = $cols[9];$pUser = $cols[5];$pPass = $cols[6];$aUser = $cols[7];$aPass = $cols[8];$project = [];$address = [];$project = $this->em->getRepository(Project::class)->findBy(['projectId' => $projectId]);if (count($project) == 0) {continue;}$project = $project[0];if ($pUser && $pPass) {$project->setSoapUsername($pUser);$project->setSoapPassword($pPass);$this->em->persist($project);$this->em->flush();}if ($aUser && $aPass) {$address = $this->em->getRepository(Address::class)->findBy(['project' => $project->getId(), 'eckId' => $eckId ]);if (count($address) == 0) {continue;}$address = $address[0];$address->setSoapUsername($aUser);$address->setSoapPassword($aPass);$this->em->persist($address);$this->em->flush();}}if($i % 400 ==0) {$this->em->flush();}$i++;*//*//// ACTIES//if ($i > 0) {try {$projectId = $cols[0];$eckId = $cols[1];$projects = $this->em->getRepository(Project::class)->findBy(['projectId' => $projectId]);if (count($projects) == 0) {array_push($errors, 'Project not found: '.$projectId.' on row '.$i);continue;}$project = $projects[0];$addresses = $this->em->getRepository(Address::class)->findBy(['project' => $project->getId(), 'eckId' => $eckId ]);if (count($addresses) == 0) {array_push($errors, 'Address not found: '.$eckId.', for project: '.$project->getName().' on row '.$i);continue;}$address = $addresses[0];$a = new Action();$createdAt = new \DateTime('now');try {$createdAt = new \DateTime($cols[3]);} catch(\Exception $e){}try {$a->setCreatedAt($createdAt);} catch(\Exception $e){}$a->setAddress($address);$areaCustom = $cols[11];$area = $this->em->getRepository(Area::class)->findBy(['name' => $areaCustom, 'address' => $address->getId() ]);if (count($area) > 0) {$a->setArea($area[0]);} else {$a->setAreaCustom(htmlspecialchars($areaCustom));}$a->setTitle(htmlspecialchars(strlen($cols[5]) > 50 ? substr($cols[5],0,50)."..." : $cols[5]));$closedAt = null;try {$closedAt = new \DateTime($cols[8]);} catch(\Exception $e){}try {$a->setClosedAt($cols[7] == 'True' ? $closedAt : null);} catch(\Exception $e){}$a->setDescription(htmlspecialchars($cols[5]));$a->setMiRegel($cols[2]);$a->setPriority('low');$a->setStatus($cols[7] == 'True' ? 'afgemeld' : 'open');$a->setType('actie');switch ($cols[6]) {case 'L':$a->setOwner('Van Eck');break;case 'D':$a->setOwner('Derde');break;case 'K':$a->setOwner('Klant');break;}$this->em->persist($a);//$this->em->flush();} catch(\Exception $e) {array_push($errors, $e);}}if($i % 2000 ==0) {$this->em->flush();}*//*//// USERS//if ($i > 0) {$person = new Person();$person->setFirstname($cols[$lookup['firstname']]);$person->setLastname($cols[$lookup['lastname']]);$person->setHoursWeek($cols[$lookup['uren_week']] ? $cols[$lookup['uren_week']] : null);$person->setHoursDay($cols[$lookup['uren_day']] ? $cols[$lookup['uren_day']] : null);$this->em->persist($person);$user = new User();$user->setPerson($person);$user->setEmail($cols[$lookup['email']]);$user->setPassword($this->userPasswordHasher->hashPassword($user, 'Eck173!'));$user->setLocale('nl');$user->setRoles(['ROLE_EMPLOYEE']);$this->em->persist($user);}if($i % 2000 ==0) {$this->em->flush();}*//*//// TIMESHEETS//if ($i > 0) {$user = $this->em->getRepository(User::class)->findBy(['email' => $cols[$lookup['email']]]);if (count($user) == 0) {continue;}$existing = $this->em->getRepository(Timesheet::class)->findBy(['start' => new \DateTime($cols[$lookup['start']]), 'end' => new \DateTime($cols[$lookup['end']]), 'user' => $user[0]->getId()]);if ($existing) {continue;}$timesheet = new Timesheet();$timesheet->setUser($user[0]);$timesheet->setDescription($cols[$lookup['description']]);$timesheet->setStart(new \DateTime($cols[$lookup['start']]));$timesheet->setEnd(new \DateTime($cols[$lookup['end']]));$timesheet->setTotalHours($cols[$lookup['total_hours']]);$timesheet->setTotalMinutes($cols[$lookup['total_minutes']]);$timesheet->setLocation($cols[$lookup['location']]);$timesheet->setStatus($cols[$lookup['status']]);$timesheet->setOvernachting($cols[$lookup['overnachting']] ? $cols[$lookup['overnachting']] : null);$timesheet->setBedrijfsauto($cols[$lookup['bedrijfsauto']] ? $cols[$lookup['bedrijfsauto']] : null);$timesheet->setBreak($cols[$lookup['break']] ? $cols[$lookup['break']] : null);$timesheet->setCreatedAt(new \DateTime($cols[$lookup['created_at']]));$timesheet->setType($cols[$lookup['type']]);$this->em->persist($timesheet);}if($i % 500 ==0) {$this->em->flush();}*/++$i;}//dump($errors);}// dump($areas);// dump($groundPlans);// dump($counter);// dump($counter2);// dump($counter3);if ($isLive) {$this->em->flush();}fclose($handle);return new Response('done');}#[Route(path: '/fetch_media', name: 'fetch_media')]public function fetchMedia(Request $request, KernelInterface $kernel): Response{$data = json_decode($request->getContent(), true);if (!$data || ($data && !$data['contentUrl'])) {$data['contentUrl'] = $request->query->get('contentUrl');if (!$data) {throw new HttpException(404, 'no contentUrl parameter was received');}}$rootDir = $kernel->getProjectDir();$file = $rootDir.'/public'.$data['contentUrl'];if (!file_exists($file)) {throw new HttpException(404, 'requested file url not found on server');}return new BinaryFileResponse($file);}#[Route(path: '/fetch_visit_rapport', name: 'fetch_visit_rapport')]public function fetchVisitRapport(Request $request){$data = json_decode($request->getContent(), true);if (!$data || ($data && (!$data['address'] || !$data['storing']))) {$data['address'] = $request->query->get('address');$data['storing'] = $request->query->get('storing');if (!$data || ($data && (!$data['address'] || !$data['storing']))) {throw new HttpException(404, 'no address or storing parameter was received');}}$address = $this->em->getRepository(Address::class)->findOneBy(['uuid' => $data['address']]);$method = 'GetServiceRapport';$werkm = $address->getProject()->getWerkm() ? $address->getProject()->getWerkm() : 0;$operationBody = ['Werkm' => $werkm,'Storing' => $data['storing'],];$result = $this->soap->callSoap($method, $operationBody, $werkm);if (!$result->Result) {throw new HttpException(404, 'requested file url not found on server');}return new Response($result->Rapport);}#[Route(path: '/fetch_document_bestand', name: 'fetch_document_bestand')]public function fetchDocument(Request $request){$data = json_decode($request->getContent(), true);if (!$data || ($data && (!$data['address'] || !$data['type']))) {$data['address'] = $request->query->get('address');$data['type'] = $request->query->get('type');$data['artikelnummer'] = $request->query->get('artikelnummer');$data['bestandnaam'] = $request->query->get('bestandnaam');$data['onderdeel'] = $request->query->get('onderdeel');$data['werknemer'] = $request->query->get('werknemer');if (!$data || ($data && (!$data['address'] || !$data['type']))) {throw new HttpException(404, 'no type parameter was received');}}$method = $data['type'];$address = $this->em->getRepository(Address::class)->findOneBy(['uuid' => $data['address']]);$werkm = $address->getProject()->getWerkm() ? $address->getProject()->getWerkm() : 0;switch ($data['type']) {case 'GetBestandenProduct':$operationBody = ['Werkm' => $werkm,'Artikelnummer' => $data['artikelnummer'],'Bestanden' => '[]',];$result = $this->soap->callSoap($method, $operationBody, $werkm);$res = [];if ($result->Bestanden && property_exists($result->Bestanden, 'string')) {$res = (array) $result->Bestanden->string;}return new Response(json_encode($res));break;case 'GetBestandProduct':$operationBody = ['Werkm' => $werkm,'Artikelnummer' => $data['artikelnummer'],'Bestandnaam' => $data['bestandnaam'],'Bestand' => '[]',];$result = $this->soap->callSoap($method, $operationBody, $werkm);return new Response($result->Bestand);break;case 'GetBestandenWerknemer':$operationBody = ['Werkm' => $werkm,'Werknemer' => $data['werknemer'],'Bestanden' => '[]',];$result = $this->soap->callSoap($method, $operationBody, $werkm);$res = [];if ($result->Bestanden && property_exists($result->Bestanden, 'string')) {$res = (array) $result->Bestanden->string;}return new Response(json_encode($res));break;case 'GetBestandWerknemer':$operationBody = ['Werkm' => $werkm,'Werknemer' => $data['werknemer'],'Bestandnaam' => $data['bestandnaam'],'Bestand' => '[]',];$result = $this->soap->callSoap($method, $operationBody, $werkm);return new Response($result->Bestand);break;case 'GetBestandKlant':$eckIds = $address->getEckIds();foreach ($eckIds as $eckId) {$operationBody = ['Werkm' => $werkm,'Project' => $address->getProject()->getProjectId(),'ID' => $eckId,'Bestandnaam' => $data['bestandnaam'],'Bestand' => '[]',];$result = $this->soap->callSoap($method, $operationBody, $werkm);if (property_exists($result, 'Bestand')) {return new Response($result->Bestand);}}break;}}}