src/StartPlatz/Bundle/AlphaBundle/Controller/StartupController.php line 587

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\StartPlatz\Bundle\AlphaBundle\Controller;
  3. use App\StartPlatz\Bundle\AlphaBundle\Entity\Feed;
  4. use App\StartPlatz\Bundle\AlphaBundle\Entity\Page;
  5. use App\StartPlatz\Bundle\MemberBundle\Entity\Member;
  6. use App\StartPlatz\Bundle\MemberBundle\Entity\MemberTeam;
  7. use App\StartPlatz\Bundle\MemberBundle\Entity\Option;
  8. use App\StartPlatz\Bundle\MemberBundle\Entity\Team;
  9. use App\StartPlatz\Bundle\StartupBundle\Entity\Application;
  10. use App\StartPlatz\Bundle\StartupBundle\Entity\Batch;
  11. use App\StartPlatz\Bundle\StartupBundle\Entity\Startup;
  12. use App\StartPlatz\Bundle\StartupBundle\Entity\StartupAttribute;
  13. use App\StartPlatz\Bundle\StartupBundle\Entity\StartupLifecycleEvent;
  14. use App\StartPlatz\Bundle\StartupBundle\Entity\StartupRelevance;
  15. use App\StartPlatz\Bundle\StartupBundle\Form\LivecycleEventType;
  16. use App\StartPlatz\Bundle\WebsiteBundle\Utility\Utility;
  17. use DateTime;
  18. use Eckinox\TinymceBundle\Form\Type\TinymceType;
  19. use Speicher210\CloudinaryBundle\Cloudinary\Api;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use stdClass;
  22. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  23. use Symfony\Component\Mime\Address;
  24. use Symfony\Component\Mime\Email;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  27. use App\StartPlatz\Bundle\FeedbackBundle\FeedbackService;
  28. use App\StartPlatz\Bundle\StartupBundle\Form\StartupType;
  29. use App\StartPlatz\Bundle\UserBundle\Entity\User;
  30. use App\StartPlatz\Bundle\WebsiteBundle\MenuTranslationService;
  31. use App\StartPlatz\Bundle\MentorsBundle\Service\WordPressMenuService;
  32. use Doctrine\ORM\EntityManagerInterface;
  33. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  34. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  35. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  36. use Symfony\Component\Form\FormFactoryInterface;
  37. use Symfony\Component\Mailer\MailerInterface;
  38. use Symfony\Component\HttpFoundation\Request;
  39. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  40. class StartupController extends AbstractController
  41. {
  42.     public function __construct(
  43.         private readonly EntityManagerInterface $entityManager,
  44.         private readonly SessionInterface $session,
  45.         private readonly FormFactoryInterface $formFactory,
  46.         private readonly FeedbackService $feedbackService,
  47.         private readonly MenuTranslationService $menuTranslationService,
  48.         private readonly Api $cloudinary,
  49.         private readonly MailerInterface $mailer,
  50.         private readonly WordPressMenuService $wordPressMenuService
  51.     ) {
  52.     }
  53.     // NOTE: AcceleratorStartupsIndexAction was moved to AcceleratorStartupController
  54.     // Routes: /accelerator/startups and /en/accelerator/startups
  55.     #[Route('/x/connect/startups/home'name'connect_startup_index')]
  56.     /**
  57.      * @IsGranted("ROLE_USER")
  58.      */
  59.     public function indexStartupsSpconnectAction(Request $request): Response
  60.     {
  61.         return $this->redirectToRoute('connect_startup_index'$request->query->all(), 301);
  62.     }
  63.     #[Route('/startups'name'homepage_startups_home')]
  64.     #[Route('/en/startups'name'homepage_startups_home_english')]
  65.     #[Route('/fr/startups'name'homepage_startups_home_french')]
  66.     public function indexStartupsHomepageAction(Request $request)
  67.     {
  68.                 $redirect     json_decode(base64_decode((string) $request->get('redirect')));
  69.         $redirectUrl  $request->get('redirect');
  70.         $templateVars $this->entityManager->getRepository(Startup::class)->getTemplateVars($request);
  71.         $orderBy      $templateVars['dimensions'] ?: ['score' => 'DESC'];
  72.         // Neue Zeile - Sortierung nach lastModified (neueste zuerst)
  73.         $orderBy $templateVars['dimensions'] ?: ['lastModified' => 'DESC'];
  74.         $visibility   'public';
  75.         $criteria     = ['visibility' => $visibility] + $templateVars['criteria'];
  76.         $lang         Utility::getLangByPathInfo($request->getPathInfo());
  77.         $teamId 0;
  78.         if ($user $this->getUser()) {
  79.             $teamId $user->getMemberId();
  80.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  81.         }
  82.         $total $this->entityManager->getRepository(Startup::class)->countByCriteria($criteria$teamId);
  83.         if ($total 2560) {
  84.             $limit 2560;
  85.         } else {
  86.             $limit $total ?: 1;
  87.         }
  88.         if (!$page $request->get('page')) {
  89.             $page 1;
  90.         }
  91.         $startups $this->entityManager->getRepository(Startup::class)->findPaginated($criteria$teamId$orderBy$page$limit);
  92.         // UP-024: startplatz field removed from Startup entity
  93.         $startupsExtern = [];
  94.         $rheinlandPitchBatches = [];
  95.         $rheinlandPitchWinnerApplications = [];
  96.         $rheinlandPitchWinnerStartups = [];
  97.         if (array_key_exists("rheinlandPitchBestResult"$criteria)) {
  98.             /*
  99.              * now use a totally different logic
  100.              * first we find all rheinlandPitchBatches
  101.              * then we find all winnerApplications
  102.              * then we find all related startups
  103.              */
  104.             $rheinlandPitchBatches $this->entityManager->getRepository(Batch::class)->findBy(['programId'=>1,'focusStatus'=>['4_past','3_previous','2_current']], ['pitchDate'=>'DESC']);
  105.             $rheinlandPitchWinnerApplications $this->entityManager->getRepository(Application::class)->findBy(['programId'=>1,'pitchPosition'=>1], ['batchId'=>'DESC']);
  106.             $rheinlandPitchWinnerStartupIds array_map(fn (Application $entity) => $entity->getStartupId(), $rheinlandPitchWinnerApplications);
  107.             $rheinlandPitchWinnerStartups $this->entityManager->getRepository(Startup::class)->findBy(['id'=>$rheinlandPitchWinnerStartupIds]);
  108.             $rheinlandPitchWinnerStartupIds array_map(fn (Startup $entity) => $entity->getId(), $rheinlandPitchWinnerStartups);
  109.             $rheinlandPitchWinnerStartups  array_combine($rheinlandPitchWinnerStartupIds$rheinlandPitchWinnerStartups);
  110.         }
  111.         $parentPageSlug "startups";
  112.         if (!$parentPage $this->entityManager->getRepository(Page::class)->findOneBy(['slug' => $parentPageSlug])) {
  113.             $parentPage = new Page();
  114.             $parentPage->setTitle('Die STARTPLATZ Startups');
  115.             $parentPage->setTeaser('Die erfolgreichen Startups starten hier durch');
  116.             $parentPage->setDescription('Page Description');
  117.         }
  118.         $acceleratorCurrentBatchNumber $this->entityManager->getRepository(Option::class)->getAcceleratorCurrentBatchNumber();
  119.         $startupsCurrentBatch $this->entityManager->getRepository(Startup::class)->findPaginated($criteria + ['batch' => $acceleratorCurrentBatchNumber], $teamId$orderBy1128);
  120.         $startupsLastBatch $this->entityManager->getRepository(Startup::class)->findPaginated($criteria + ['batch' => $acceleratorCurrentBatchNumber -], $teamId$orderBy1128);
  121.         $startupsBatch20 $this->entityManager->getRepository(Startup::class)->findPaginated($criteria + ['batch' => $acceleratorCurrentBatchNumber -2], $teamId$orderBy1128);
  122.         // UP-024: startplatz field removed from Startup entity - these sections now empty
  123.         $startupsSpCgn = [];
  124.         $startupsSpDus = [];
  125.         $startupsAlumni = [];
  126.         // UP-024: pitchNumber, rheinlandPitch, rheinlandPitchBestResult fields removed from Startup entity
  127.         $startupsRheinlandPitch = [];
  128.         // Use findCurrentRheinlandPitchStartups() which queries via Application/Batch instead:
  129.         // $startupsRheinlandPitch = $this->entityManager->getRepository(Startup::class)->findCurrentRheinlandPitchStartups('2_current');
  130.         $startupsGruenderstipendium = [];
  131.         $startupsGruenderstipendium $this->entityManager->getRepository(Startup::class)->findPaginated($criteria + ['gsStatus' => ['funded','recommended']], $teamId$orderBy11280);
  132.         $startupsGruenderstipendiumAlumni = [];
  133.         $startupsGruenderstipendiumAlumni $this->entityManager->getRepository(Startup::class)->findPaginated($criteria + ['gsStatus' => ['alumni']], $teamId$orderBy11280);
  134.         $industries $this->entityManager->getRepository(Startup::class)->getAggregateByGroup('industry'$criteria);
  135.         // get teamIds
  136.         $teamIds array_map(fn ($entity) => $entity['teamId'], $startups);
  137.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsCurrentBatch);
  138.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsLastBatch);
  139.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsBatch20);
  140.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsSpCgn);
  141.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsSpDus);
  142.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsAlumni);
  143.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsExtern);
  144.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsRheinlandPitch);
  145.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsGruenderstipendium);
  146.         $teamIds $teamIds array_map(fn ($entity) => $entity['teamId'], $startupsGruenderstipendiumAlumni);
  147.         $teams $this->entityManager->getRepository(Team::class)->findBy(['id'=>$teamIds]);
  148.         $teamIds array_map(fn ($entity) => $entity->getId(), $teams);
  149.         $teams array_combine($teamIds$teams);
  150.         return $this->render('@StartPlatzAlphaBundle/Startup/index.startups.homepage.html.twig', [
  151.             'startups' => $startups,
  152.             'startupsCurrentBatch' => $startupsCurrentBatch,
  153.             'startupsLastBatch' => $startupsLastBatch,
  154.             'startupsBatch20' => $startupsBatch20,
  155.             'startupsSpCgn' => $startupsSpCgn,
  156.             'startupsSpDus' => $startupsSpDus,
  157.             'startupsAlumni' => $startupsAlumni,
  158.             'startupsExtern' => $startupsExtern,
  159.             'startupsRheinlandPitch'     => $startupsRheinlandPitch,
  160.             'startupsGruenderstipendium'       => $startupsGruenderstipendium,
  161.             'startupsGruenderstipendiumAlumni' => $startupsGruenderstipendiumAlumni,
  162.             'teams'              => $teams,
  163.             'currentBatchNumber' => $acceleratorCurrentBatchNumber,
  164.             'industries'         => $industries,
  165.             'parentPage'         => $parentPage,
  166.             'pageType'           => 'startup',
  167.             'topic'              => 'deepTech',
  168.             'lang' => $lang,
  169.             'rheinlandPitchBatches' => $rheinlandPitchBatches,
  170.             'rheinlandPitchWinnerApplications' => $rheinlandPitchWinnerApplications,
  171.             'rheinlandPitchWinnerStartups' => $rheinlandPitchWinnerStartups,
  172.         'maxPages' => ceil($total $limit),
  173.             'thisPage' => $page,
  174.             'total' => $total,
  175.             'limit' => $limit,
  176.             'criteria' => $criteria,
  177.             'visibility' => $visibility,
  178.             'templateVars' => $templateVars,
  179.             'backUrl' => $redirectUrl,
  180.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  181.             'redirectUrl' => base64_encode(json_encode(['path' => 'website_startups_list''parameters' => $templateVars])),
  182.         ]);
  183.     }
  184.     #[Route('/x/startups/industries/list'name'x_startups_industries_list')]
  185.     public function listIndustriesAjaxAction(Request $request)
  186.     {
  187.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  188.         $templateVars $this->entityManager->getRepository(Startup::class)->getTemplateVars($request);
  189.         $currentCriteria $templateVars['criteria'];
  190.         if (isset($templateVars['criteria']['industry'])) {
  191.             unset($templateVars['criteria']['industry']);
  192.         }
  193.         if (isset($templateVars['criteria']['isBookmarked'])) {
  194.             unset($templateVars['criteria']['isBookmarked']);
  195.         }
  196.         if (!$source $request->get('source')) {
  197.             $visibility 'sp-connect';
  198.             $targetPath "connect_startup_index";
  199.         } else {
  200.             $visibility 'public';
  201.             $targetPath "homepage_startups_home";
  202.         }
  203.         $criteria = ['visibility' => $visibility'status' => 'active''team' => 'exists'] + $templateVars['criteria'];
  204.         if ($user $this->getUser()) {
  205.             $teamId $user->getMemberId();
  206.         } else {
  207.             $teamId 0;
  208.         }
  209.         $industries $this->entityManager->getRepository(Startup::class)->findIndustries($criteria$teamId);
  210.         return $this->render('@StartPlatzAlpha/Default/list.startupIndustries.modal.html.twig', [
  211.             'title' => "Available Industries",
  212.             'industries' => $industries,
  213.             'targetPath'      => $targetPath,
  214.             'currentCriteria' => $currentCriteria,
  215.             'templateVars'    => $templateVars,
  216.             'redirectUrl' => $request->get('redirect'),
  217.         ]);
  218.     }
  219.     #[Route('/x/startups/tags/list'name'x_startups_tags_list')]
  220.     public function listTagsAjaxAction(Request $request)
  221.     {
  222.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  223.         $templateVars $this->entityManager->getRepository(Startup::class)->getTemplateVars($request);
  224.         $currentCriteria $templateVars['criteria'];
  225.         if (isset($templateVars['criteria']['tags'])) {
  226.             unset($templateVars['criteria']['tags']);
  227.         }
  228.         if (isset($templateVars['criteria']['isBookmarked'])) {
  229.             unset($templateVars['criteria']['isBookmarked']);
  230.         }
  231.         if (!$source $request->get('source')) {
  232.             $visibility 'sp-connect';
  233.             $targetPath "connect_startup_index";
  234.         } else {
  235.             $visibility 'public';
  236.             $targetPath "homepage_startups_home";
  237.         }
  238.         $criteria = ['visibility' => $visibility'status' => 'active''team' => 'exists'] + $templateVars['criteria'];
  239.         if ($user $this->getUser()) {
  240.             $teamId $user->getMemberId();
  241.         } else {
  242.             $teamId 0;
  243.         }
  244.         $entities $this->entityManager->getRepository(Startup::class)->findTags($criteria$teamId);
  245.         return $this->render('@StartPlatzAlpha/Default/list.tags.modal.html.twig', [
  246.             'title' => "Tags",
  247.             'entities' => $entities,
  248.             'btnClass' => "btn-outline-info",
  249.             'targetEntity' => "tags",
  250.             'targetPath' => $targetPath,
  251.             'currentCriteria' => $currentCriteria,
  252.             'templateVars' => $templateVars,
  253.             'redirect' => $redirect,
  254.             'redirectUrl' => $request->get('redirect'),
  255.         ]);
  256.     }
  257.     #[Route('/x/startups/filter/rheinland-pitch'name'x_startups_filter_rheinland-pitch')]
  258.     public function selectFilterRheinlandPitchAction(Request $request)
  259.     {
  260.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  261.         $templateVars $this->entityManager->getRepository(Startup::class)->getTemplateVars($request);
  262.         if (!$source $request->get('source')) {
  263.             $visibility 'sp-connect';
  264.             $targetPath "connect_startup_index";
  265.         } else {
  266.             $visibility 'public';
  267.             $targetPath "homepage_startups_home";
  268.         }
  269.         $criteria = ['visibility' => $visibility'status' => 'active''team' => 'exists'] + $templateVars['criteria'];
  270.         if ($user $this->getUser()) {
  271.             $teamId $user->getMemberId();
  272.         } else {
  273.             $teamId 0;
  274.         }
  275.         $filter $request->get('filter');
  276.         // UP-024: rheinlandPitchStatus, rheinlandPitchBestResult fields removed from Startup entity
  277.         $group1 "";
  278.         $aggregates1 = [];
  279.         $group2 "";
  280.         $aggregates2 = [];
  281.         // batches
  282.         $aggregatesBatches $this->entityManager->getRepository(Startup::class)->findApplicationsByProgramId(1);
  283.         return $this->render('@StartPlatzAlpha/Default/list.rheinland-pitch.modal.html.twig', [
  284.             'title'             => "Set Filter on {$filter}",
  285.             'btnClass'          => "btn-outline-info",
  286.             'group1'            => $group1,
  287.             'group2'            => $group2,
  288.             'aggregates1'       => $aggregates1,
  289.             'aggregates2'       => $aggregates2,
  290.             'aggregatesBatches' => $aggregatesBatches,
  291.             'targetPath'        => $targetPath,
  292.             'templateVars'      => $templateVars,
  293.             'redirect'          => $redirect,
  294.             'redirectUrl'       => $request->get('redirect'),
  295.         ]);
  296.     }
  297.     #[Route('/x/startups/filter'name'x_startups_filter')]
  298.     public function selectFilterAction(Request $request)
  299.     {
  300.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  301.         $templateVars $this->entityManager->getRepository(Startup::class)->getTemplateVars($request);
  302.         if (!$source $request->get('source')) {
  303.             $visibility 'sp-connect';
  304.         } else {
  305.             $visibility 'public';
  306.         }
  307.         if (!$targetPath $request->get('targetPath')) {
  308.             if ($visibility == 'sp-connect') {
  309.                 $targetPath "connect_startup_index";
  310.             } else {
  311.                 $targetPath "homepage_startups_home";
  312.             }
  313.         }
  314.         $criteria = ['visibility' => $visibility'status' => 'active''team' => 'exists'] + $templateVars['criteria'];
  315.         if ($user $this->getUser()) {
  316.             $teamId $user->getMemberId();
  317.         } else {
  318.             $teamId 0;
  319.         }
  320.         $group $request->get('filter');
  321.         $aggregates $this->entityManager->getRepository(Startup::class)->getAggregateByGroup($group$criteria);
  322.         $group2 "";
  323.         $aggregates2 = [];
  324.         // UP-024: accelerator, batch, batchYear, rheinlandPitch, pitchNumber fields removed from Startup entity
  325.         if ($group == 'accelerator') {
  326.             $aggregates = []; // Field removed
  327.         }
  328.         if ($group == 'rheinlandPitch') {
  329.             $aggregates = []; // Field removed
  330.         }
  331.         return $this->render('@StartPlatzAlpha/Default/list.aggregates.modal.html.twig', [
  332.             'title'        => "Set Filter on {$group}",
  333.             'aggregates'   => $aggregates,
  334.             'btnClass'     => "btn-outline-info",
  335.             'group'        => $group,
  336.             'group2'       => $group2,
  337.             'aggregates2'  => $aggregates2,
  338.             'targetPath'   => $targetPath,
  339.             'templateVars' => $templateVars,
  340.             'redirect'     => $redirect,
  341.             'redirectUrl'  => $request->get('redirect'),
  342.         ]);
  343.     }
  344.     #[Route('/startups-legacy'name'extern_startups_home')]
  345.     public function indexLegacyAction(Request $request)
  346.     {
  347.                 $member $this->entityManager->getRepository(Member::class)->findOneBy([]);
  348.         $fields $this->feedbackService->getEntityMethodsArray($member, ['teams']);
  349.         $templateVars $this->entityManager->getRepository(Member::class)->getTemplateVars($request);
  350.         if ($user $this->getUser()) {
  351.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  352.         }
  353.         $metaNameSectionBatch21 'website.startups.section.batch21';
  354.         $metaNameSectionBatch20 'website.startups.section.batch20';
  355.         $metaNameSectionBatch19 'website.startups.section.batch19';
  356.         $metaNameSectionBatch18 'website.startups.section.batch18';
  357.         $metaNameSectionBatch17 'website.startups.section.batch17';
  358.         $metaNameSectionKoeln 'website.startups.section.koeln';
  359.         $metaNameSectionDus 'website.startups.section.dus';
  360.         $metaNameSectionAlumni 'website.startups.section.alumni';
  361.         $edit $request->get('edit');
  362.         if (!in_array($edit, ['updateBatch21''updateBatch20''updateBatch19''updateBatch18''updateBatch17''updateKoeln''updateDus''updateAlumni'])) {
  363.             $edit null;
  364.         }
  365.         $sectionBatch21 $this->getSection($metaNameSectionBatch21);
  366.         $sectionBatch20 $this->getSection($metaNameSectionBatch20);
  367.         $sectionBatch19 $this->getSection($metaNameSectionBatch19);
  368.         $sectionBatch18 $this->getSection($metaNameSectionBatch18);
  369.         $sectionBatch17 $this->getSection($metaNameSectionBatch17);
  370.         $sectionKoeln $this->getSection($metaNameSectionKoeln);
  371.         $sectionDus $this->getSection($metaNameSectionDus);
  372.         $sectionAlumni $this->getSection($metaNameSectionAlumni);
  373.         switch ($edit) {
  374.             case 'updateBatch21':
  375.                 $content $this->transformArrayIntoCsvString($sectionBatch21['content']);
  376.                 $form $this->setPlainEditorForm($content);
  377.                 break;
  378.             case 'updateBatch20':
  379.                 $content $this->transformArrayIntoCsvString($sectionBatch20['content']);
  380.                 $form $this->setPlainEditorForm($content);
  381.                 break;
  382.             case 'updateBatch19':
  383.                 $content $this->transformArrayIntoCsvString($sectionBatch19['content']);
  384.                 $form $this->setPlainEditorForm($content);
  385.                 break;
  386.             case 'updateBatch18':
  387.                 $content $this->transformArrayIntoCsvString($sectionBatch18['content']);
  388.                 $form $this->setPlainEditorForm($content);
  389.                 break;
  390.             case 'updateBatch17':
  391.                 $content $this->transformArrayIntoCsvString($sectionBatch17['content']);
  392.                 $form $this->setPlainEditorForm($content);
  393.                 break;
  394.             case 'updateKoeln':
  395.                 $content $this->transformArrayIntoCsvString($sectionKoeln['content']);
  396.                 $form $this->setPlainEditorForm($content);
  397.                 break;
  398.             case 'updateDus':
  399.                 $content $this->transformArrayIntoCsvString($sectionDus['content']);
  400.                 $form $this->setPlainEditorForm($content);
  401.                 break;
  402.             case 'updateAlumni':
  403.                 $content $this->transformArrayIntoCsvString($sectionAlumni['content']);
  404.                 $form $this->setPlainEditorForm($content);
  405.                 break;
  406.             default:
  407.                 $content "";
  408.                 $form $this->setEditorForm($content);
  409.         }
  410.         $form->handleRequest($request);
  411.         if ($form->isSubmitted() && $form->isValid()) {
  412.             $data $form->getData();
  413.             $importString $data['content'];
  414.             $rows explode(PHP_EOL, (string) $importString);
  415.             switch ($edit) {
  416.                 case 'updateBatch21':
  417.                     $sectionBatch21['content'] = [];
  418.                     foreach ($rows as $row) {
  419.                         $sectionBatch21['content'][] = str_getcsv($row"\t");
  420.                     }
  421.                     $this->entityManager->getRepository(Option::class)->setOptionMetaValueJsonEncoded($metaNameSectionBatch21null$sectionBatch21);
  422.                     break;
  423.                 case 'updateBatch20':
  424.                     $sectionBatch20['content'] = [];
  425.                     foreach ($rows as $row) {
  426.                         $sectionBatch20['content'][] = str_getcsv($row"\t");
  427.                     }
  428.                     $this->entityManager->getRepository(Option::class)->setOptionMetaValueJsonEncoded($metaNameSectionBatch20null$sectionBatch20);
  429.                     break;
  430.                 case 'updateBatch19':
  431.                     $sectionBatch19['content'] = [];
  432.                     foreach ($rows as $row) {
  433.                         $sectionBatch19['content'][] = str_getcsv($row"\t");
  434.                     }
  435.                     $this->entityManager->getRepository(Option::class)->setOptionMetaValueJsonEncoded($metaNameSectionBatch19null$sectionBatch19);
  436.                     break;
  437.                 case 'updateBatch18':
  438.                     $sectionBatch18['content'] = [];
  439.                     foreach ($rows as $row) {
  440.                         $sectionBatch18['content'][] = str_getcsv($row"\t");
  441.                     }
  442.                     $this->entityManager->getRepository(Option::class)->setOptionMetaValueJsonEncoded($metaNameSectionBatch18null$sectionBatch18);
  443.                     break;
  444.                 case 'updateBatch17':
  445.                     $sectionBatch17['content'] = [];
  446.                     foreach ($rows as $row) {
  447.                         $sectionBatch17['content'][] = str_getcsv($row"\t");
  448.                     }
  449.                     $this->entityManager->getRepository(Option::class)->setOptionMetaValueJsonEncoded($metaNameSectionBatch17null$sectionBatch17);
  450.                     break;
  451.                 case 'updateKoeln':
  452.                     $sectionKoeln['content'] = [];
  453.                     foreach ($rows as $row) {
  454.                         $sectionKoeln['content'][] = str_getcsv($row"\t");
  455.                     }
  456.                     $this->entityManager->getRepository(Option::class)->setOptionMetaValueJsonEncoded($metaNameSectionKoelnnull$sectionKoeln);
  457.                     break;
  458.                 case 'updateDus':
  459.                     $sectionDus['content'] = [];
  460.                     foreach ($rows as $row) {
  461.                         $sectionDus['content'][] = str_getcsv($row"\t");
  462.                     }
  463.                     $this->entityManager->getRepository(Option::class)->setOptionMetaValueJsonEncoded($metaNameSectionDusnull$sectionDus);
  464.                     break;
  465.                 case 'updateAlumni':
  466.                     $sectionAlumni['content'] = [];
  467.                     foreach ($rows as $row) {
  468.                         $sectionAlumni['content'][] = str_getcsv($row"\t");
  469.                     }
  470.                     $this->entityManager->getRepository(Option::class)->setOptionMetaValueJsonEncoded($metaNameSectionAlumninull$sectionAlumni);
  471.                     break;
  472.             }
  473.             $this->session->getFlashBag()->add('notice''SUCCESS data saved');
  474.         }
  475.         $sectionBatch21 $this->getSection($metaNameSectionBatch21);
  476.         $sectionBatch20 $this->getSection($metaNameSectionBatch20);
  477.         $sectionBatch19 $this->getSection($metaNameSectionBatch19);
  478.         $sectionBatch18 $this->getSection($metaNameSectionBatch18);
  479.         $sectionBatch17 $this->getSection($metaNameSectionBatch17);
  480.         $sectionKoeln $this->getSection($metaNameSectionKoeln);
  481.         $sectionDus $this->getSection($metaNameSectionDus);
  482.         $sectionAlumni $this->getSection($metaNameSectionAlumni);
  483.         return $this->render('@StartPlatzAlphaBundle/Startup/index.legacy.html.twig', [
  484.             'templateVars' => [],
  485.             'form' => $form->createView(),
  486.             'sectionBatch21' => $sectionBatch21,
  487.             'sectionBatch20' => $sectionBatch20,
  488.             'sectionBatch19' => $sectionBatch19,
  489.             'sectionBatch18' => $sectionBatch18,
  490.             'sectionBatch17' => $sectionBatch17,
  491.             'sectionKoeln' => $sectionKoeln,
  492.             'sectionDus' => $sectionDus,
  493.             'sectionAlumni' => $sectionAlumni,
  494.             'edit' => $edit,
  495.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  496.             'redirectUrl' => base64_encode(json_encode(['path' => 'extern_startups_home''parameters' => []])),
  497.         ]);
  498.     }
  499.     #[Route('/startup/{slug}'name'homepage_startup_single')]
  500.     #[Route('/en/startup/{slug}'name'homepage_startup_single_english')]
  501.     public function singleAction(Request $request$slug)
  502.     {
  503.                 $templateVars $this->entityManager->getRepository(Team::class)->getTemplateVars($request);
  504.         /** @var User $user */
  505.         if ($user $this->getUser()) {
  506.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  507.         }
  508.         $id explode('-', (string) $slug)[0];
  509.         $slug explode('-', (string) $slug)[1];
  510.         /** @var Startup $startup */
  511.         if (!$startup $this->entityManager->getRepository(Startup::class)->findOneBy(['id' => $id])) {
  512.             $this->session->getFlashBag()->add('notice''ERROR slug not found');
  513.             return $this->redirect($this->generateUrl('homepage_startups_home'));
  514.         }
  515.         if (!$team $this->entityManager->getRepository(Team::class)->findOneBy(['id' => $startup->getTeamId()])) {
  516.             $this->session->getFlashBag()->add('notice''ERROR insufficient data');
  517.             return $this->redirect($this->generateUrl('homepage_startups_home'));
  518.         }
  519.         $feedItems = [];
  520.         $entities = [];
  521.         if ($startup->getSlug()) {
  522.             // feedTags are expected to be a jsonArray
  523.             $feedTags json_encode([$startup->getSlug()]);
  524.             $feedItems $this->entityManager->getRepository(Feed::class)->findByFeedTag($feedTags);
  525.             $entities $this->entityManager->getRepository(Feed::class)->getEntitiesByFeedItems($feedItems);
  526.         }
  527.         // rheinlandPitch has programId == 1
  528.         $rheinlandPitches $this->entityManager->getRepository(Application::class)->findApplicationsAndBatchesByStartupIdAndProgramId($id1);
  529.         $memberTypes = [];
  530.         $teamIndustries   = [];
  531.         $teamIndustryList "";
  532.         $applications     = [];
  533.         if ($team) {
  534.             if ($team->getType() == 'Partner') {
  535.                 $memberTypes = ['GF''AP'];
  536.             }
  537.             $teamIndustries $team->getIndustries();
  538.             $teamIndustryList explode("#", (string) $teamIndustries);
  539.             // plausibility checks for members of that team
  540.             $this->entityManager->getRepository(Member::class)->checkIfDescriptionIsEmptyButMentorProfileIsFilled($team);
  541.             $relevantProgramIds = ['1','2','3'];
  542.             $applications $this->entityManager->getRepository(Application::class)->findBy(['teamId'=>$team->getId(),'programId'=>$relevantProgramIds]);
  543.         }
  544.         $members $this->entityManager->getRepository(MemberTeam::class)->getTeamMembers($id$memberTypes);
  545.         $allowEdit false;
  546.         $teamMember false;
  547.         if($user) {
  548.             $userEmail $this->getUser()->getEmail();
  549.             foreach ($members as $member) {
  550.                 if ($member['email'] == $userEmail) {
  551.                     $teamMember true;
  552.                     if ($member['type'] == 'AP' || $member['type'] == 'GF') {
  553.                         $allowEdit true;
  554.                     }
  555.                 }
  556.             }
  557.         }
  558.         // create slugs from team on the fly and from startup, what is stored there
  559.         if ($team) {
  560.             $slugs[] = Utility::generateSlug($team->getShortName());
  561.         }
  562.         if ($startup->getSlug()) {
  563.             $slugs[] = $startup->getSlug();
  564.         }
  565.         $feedTags json_encode(array_values(array_unique($slugs)));
  566.         if ($feedTags) {
  567.             $feedItems $this->entityManager->getRepository(Feed::class)->findByFeedTag($feedTags);
  568.             $entities $this->entityManager->getRepository(Feed::class)->getEntitiesByFeedItems($feedItems);
  569.         }
  570.         $hasVisibleApplication false;
  571.         foreach ($applications as $application) {
  572.             if($application->getVisibility() == 'sp-connect') {
  573.                 $hasVisibleApplication true;
  574.                 break;
  575.             }
  576.         }
  577.         $lang Utility::getLangByPathInfo($request->getPathInfo());
  578.         if ($startup->getVisibility() == 'public') {
  579.             return $this->render('@StartPlatzAlphaBundle/Startup/single.homepage.html.twig', [
  580.                 'id' => $id,
  581.                 'startup' => $startup,
  582.                 'team' => $team,
  583.                 'feedItems' => $feedItems,
  584.                 'entities' => $entities,
  585.                 'lang' => $lang,
  586.                 'rheinlandPitches' => $rheinlandPitches,
  587.                 'redirectUrl' => base64_encode(json_encode(['path' => 'homepage_startup_single''parameters' => ['slug' => $id '-' $slug]])),
  588.                 'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  589.                 'applications' => $applications,
  590.                 'hasVisibleApplication' => $hasVisibleApplication,
  591.                 'methodsTeam'           => $team $this->feedbackService->getEntityMethodsArray($team, ['services''members']) : [],
  592.                 'methodsStartup' => $startup $this->feedbackService->getEntityMethodsArray($startup, []) : [],
  593.                 'feedTags' => $feedTags,
  594.                 'templateVars' => $templateVars,
  595.                 'queryString' => '',
  596.                 //  'members' => $members,
  597.                 'memberTypes' => $memberTypes,
  598.                 'teamIndustryList' => $teamIndustryList,
  599.                 'allowEdit' => $allowEdit,
  600.                 'teamMember' => $teamMember,
  601.                 'memberTypeLabels' => $this->entityManager->getRepository(MemberTeam::class)->getMemberTypeLabels(),
  602.                 'currentPath' => '/x/connect/team/{id}',
  603.                 'backUrl' => $request->get('redirect') ?: base64_encode(json_encode(['path' => 'connect_startup_index''parameters' => $templateVars])),
  604.             ]);
  605.         } else {
  606.             return $this->render('@StartPlatzAlphaBundle/Startup/single.homepage.sorry.html.twig', [
  607.                 'lang' => $lang,
  608.                 'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  609.                 'redirectUrl' => base64_encode(json_encode(['path' => 'homepage_startup_single''parameters' => ['slug' => $id '-' $slug]])),
  610.              ]);
  611.         }
  612.     }
  613.     #[Route('/x/community/startups/home/'name'x_startups_home')]
  614.     /**
  615.      * @IsGranted("ROLE_USER")
  616.      */
  617.     public function indexStartupsAction(Request $request)
  618.     {
  619.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  620.         $redirectUrl $request->get('redirect');
  621.         $templateVars $this->entityManager->getRepository(Startup::class)->getTemplateVars($request);
  622.         $orderBy $templateVars['dimensions'] ?: [];
  623.         $visibility 'sp-connect';
  624.         $criteria = ['visibility' => $visibility] + $templateVars['criteria'];
  625.         $teamId 0;
  626.         if ($user $this->getUser()) {
  627.             $teamId $user->getMemberId();
  628.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  629.             $member $this->entityManager->getRepository(Member::class)->find($user->getMemberId());
  630.         }
  631.         $total $this->entityManager->getRepository(Startup::class)->countByCriteria($criteria$teamId);
  632.         if ($total 12) {
  633.             $limit 12;
  634.         } else {
  635.             $limit $total ?: 1;
  636.         }
  637.         if (!$page $request->get('page')) {
  638.             $page 1;
  639.         }
  640.         $startups $this->entityManager->getRepository(Startup::class)->findPaginated($criteria$teamId$orderBy$page$limit);
  641.         $lang $request->get('lang');
  642.         if (str_contains((string) $member->getTags(), 'beta')) {
  643.             $view '@StartPlatzAlphaBundle/Startup/Startups__index.twig';
  644.         } else {
  645.             $view '@StartPlatzAlphaBundle/Startup/Startups__index_old.twig';
  646.         }
  647.         return $this->render($view, [
  648.             'maxPages' => ceil($total $limit),
  649.             'thisPage' => $page,
  650.             'total' => $total,
  651.             'criteria' => $criteria,
  652.             'visibility' => $visibility,
  653.             'templateVars' => $templateVars,
  654.             'startups' => $startups,
  655.             'backUrl' => $redirectUrl,
  656.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  657.             'redirectUrl' => base64_encode(json_encode(['path' => 'website_startups_list''parameters' => $templateVars])),
  658.         ]);
  659.     }
  660.     #[Route('/startup-database/list/'name'website_startups_list')]
  661.     #[Route('/startup-database/list/'name'extern_startups_list')]
  662.     /**
  663.      * @IsGranted("ROLE_USER")
  664.      */
  665.     public function listAction(Request $request)
  666.     {
  667.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  668.         $redirectUrl $request->get('redirect');
  669.         $templateVars $this->entityManager->getRepository(Startup::class)->getTemplateVars($request);
  670.         $orderBy $templateVars['dimensions'] ?: [];
  671.         $visibility 'public';
  672.         $criteria = ['visibility' => $visibility] + $templateVars['criteria'];
  673.         $teamId 0;
  674.         if ($user $this->getUser()) {
  675.             $teamId $user->getMemberId();
  676.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  677.         }
  678.         $total $this->entityManager->getRepository(Startup::class)->countByCriteria($criteria$teamId);
  679.         if ($total 12) {
  680.             $limit 12;
  681.         } else {
  682.             $limit $total ?: 1;
  683.         }
  684.         if (!$page $request->get('page')) {
  685.             $page 1;
  686.         }
  687.         $startups $this->entityManager->getRepository(Startup::class)->findPaginated($criteria$teamId$orderBy$page$limit);
  688.         $lang $request->get('lang');
  689.         $targetPath $request->server->get('REQUEST_URI');
  690.         return $this->render('@StartPlatzAlphaBundle/Startup/list.html.twig', [
  691.             'targetPath' => $targetPath,
  692.             'lang' => $lang,
  693.             'maxPages' => ceil($total $limit),
  694.             'thisPage' => $page,
  695.             'total' => $total,
  696.             'criteria' => $criteria,
  697.             'visibility' => $visibility,
  698.             'templateVars' => $templateVars,
  699.             'startups' => $startups,
  700.             'backUrl' => $redirectUrl,
  701.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  702.             'redirectUrl' => base64_encode(json_encode(['path' => 'website_startups_list''parameters' => $templateVars])),
  703.         ]);
  704.     }
  705.     #[Route('/startup-database/show/{id}/{slug}'name'extern_startups_single')]
  706.     public function singleExternAction(Request $request$id$slug)
  707.     {
  708.                 if ($user $this->getUser()) {
  709.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  710.         }
  711.         if (!$redirect json_decode(base64_decode((string) $request->get('redirect')))) {
  712.             $redirect = new stdClass();
  713.             $redirect->path 'website_startups_list';
  714.             $redirect->parameters = [];
  715.         }
  716.         $redirectUrl $request->get('redirect');
  717.         if (!$startup $this->entityManager->getRepository(Startup::class)->findOneBy(['id' => $id'visibility' => 'public'])) {
  718.             $this->session->getFlashBag()->add('notice''ERROR 10 entity not found');
  719.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  720.         }
  721.         if ($slug != $startup->getSlug()) {
  722.             return $this->redirect($this->generateUrl('extern_startups_single', ['id' => $id'slug' => $startup->getSlug(), 'redirect' => $redirectUrl]));
  723.         }
  724.         $rightToAccessTeam false;
  725.         $team false;
  726.         $memberId 0;
  727.         $teamId $startup->getTeamId();
  728.         if ($user $this->getUser()) {
  729.             $memberId $user->getMemberId();
  730.             if (!$member $this->entityManager->getRepository(Member::class)->findOneBy(['id' => $memberId])) {
  731.                 $this->session->getFlashBag()->add('notice''ERROR There is a problem with your account please contact support@startplatz.de');
  732.                 return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  733.             }
  734.             if ($team $this->entityManager->getRepository(Team::class)->findOneBy(['id' => $teamId])) {
  735.                 $rightToAccessTeam $this->entityManager->getRepository(MemberTeam::class)->checkAccessRight($member$team);
  736.                 $team $this->entityManager->getRepository(Team::class)->checkConsistencyWithStartup($team$startup);
  737.             }
  738.         }
  739.         // the use of memberId is on purpose
  740.         $startupAttributes $this->entityManager->getRepository(StartupAttribute::class)->findOneBy(['startupId' => $startup->getId(), 'teamId' => $memberId]);
  741.         $startupLivecycleEvents $this->entityManager->getRepository(StartupLifecycleEvent::class)->findBy(['startupId' => $startup->getId()], ['eventDate' => 'ASC']);
  742.         $this->entityManager->getRepository(StartupRelevance::class)->updateByUserAction($id'click');
  743.         $rheinlandPitches $this->entityManager->getRepository(Application::class)->findBy(['startupId' => $id], ['batchId' => 'DESC']);
  744.         return $this->render('@StartPlatzAlphaBundle/Startup/single.extern.twig', [
  745.             'templateVars' => [],
  746.             'startup' => $startup,
  747.             'rightToAccessTeam' => $rightToAccessTeam,
  748.             'startupAttributes' => $startupAttributes,
  749.             'rheinlandPitches' => $rheinlandPitches,
  750.             'startupLivecycleEvents' => $startupLivecycleEvents,
  751.             'backUrl' => $redirectUrl,
  752.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  753.             'redirectUrl' => base64_encode(json_encode(['path' => 'extern_startups_single''parameters' => ['id' => $id'slug' => $startup->getSlug()]])),
  754.         ]);
  755.     }
  756.     #[Route('/x/community/startup/single/{id}'name'x_community_startup_single')]
  757.     /**
  758.      * @IsGranted("ROLE_USER")
  759.      */
  760.     public function singleCommunityAction(Request $request$id)
  761.     {
  762.                 if ($user $this->getUser()) {
  763.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  764.         }
  765.         if (!$redirect json_decode(base64_decode((string) $request->get('redirect')))) {
  766.             $redirect = new stdClass();
  767.             $redirect->path 'x_home';
  768.             $redirect->parameters = [];
  769.         }
  770.         $redirectUrl $request->get('redirect');
  771.         if (!$startup $this->entityManager->getRepository(Startup::class)->findSingleStartupByVisibility($id'sp-connect')) {
  772.             $this->session->getFlashBag()->add('notice''ERROR 20 entity not found');
  773.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  774.         }
  775.         $rightToAccessTeam false;
  776.         $team false;
  777.         $memberId 0;
  778.         $teamId $startup->getTeamId();
  779.         if ($user $this->getUser()) {
  780.             $memberId $user->getMemberId();
  781.             if (!$member $this->entityManager->getRepository(Member::class)->findOneBy(['id' => $memberId])) {
  782.                 $this->session->getFlashBag()->add('notice''ERROR There is a problem with your account please contact support@startplatz.de');
  783.                 return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  784.             }
  785.             if ($team $this->entityManager->getRepository(Team::class)->findOneBy(['id' => $teamId])) {
  786.                 $rightToAccessTeam $this->entityManager->getRepository(MemberTeam::class)->checkAccessRight($member$team);
  787.                 $team $this->entityManager->getRepository(Team::class)->checkConsistencyWithStartup($team$startup);
  788.             }
  789.         }
  790.         // the use of memberId is on purpose
  791.         $startupAttributes $this->entityManager->getRepository(StartupAttribute::class)->findOneBy(['startupId' => $startup->getId(), 'teamId' => $memberId]);
  792.         $startupLivecycleEvents $this->entityManager->getRepository(StartupLifecycleEvent::class)->findBy(['startupId' => $startup->getId()], ['eventDate' => 'ASC']);
  793.         $this->entityManager->getRepository(StartupRelevance::class)->updateByUserAction($id'click');
  794.         $rheinlandPitches $this->entityManager->getRepository(Application::class)->findBy(['startupId' => $id], ['batchId' => 'DESC']);
  795.         $lang $request->get('lang');
  796.         $targetPath $request->server->get('REQUEST_URI');
  797.         return $this->render('@StartPlatzAlphaBundle/Startup/single.sp-connect.html.twig', [
  798.             'targetPath' => $targetPath,
  799.             'lang' => $lang,
  800.             'templateVars' => [],
  801.             'startup' => $startup,
  802.             'rightToAccessTeam' => $rightToAccessTeam,
  803.             'startupAttributes' => $startupAttributes,
  804.             'rheinlandPitches' => $rheinlandPitches,
  805.             'startupLivecycleEvents' => $startupLivecycleEvents,
  806.             'backUrl' => $redirectUrl,
  807.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  808.             'redirectUrl' => base64_encode(json_encode(['path' => 'extern_startups_single''parameters' => ['id' => $id'slug' => $startup->getSlug()]])),
  809.         ]);
  810.     }
  811.     #[Route('/allmeda/startups/toggle-ajax/{id}/{field}/{action}'name'startup_edit_field_ajax')]
  812.     /**
  813.      * @IsGranted("ROLE_ADMIN")
  814.      */
  815.     public function setToggleAjaxAction($id$field$action)
  816.     {
  817.                 $response $this->entityManager->getRepository(Startup::class)->setField($field$action$id);
  818.         if (str_starts_with((string) $response'field ')) {
  819.             $response "SUCCESS $response";
  820.         }
  821.         return new Response($response);
  822.     }
  823.     #[Route('/x/connect/startup/edit/{id}/set-with-data'name'x_connect_startup_set_field_ajax_with_data')]
  824.     #[Route('/x/connect/startup/edit/{id}/set/{field}/{action}'name'x_connect_startup_set_field_ajax')]
  825.     /**
  826.      * @IsGranted("ROLE_USER")
  827.      */
  828.     public function setAjaxAction(Request $request$id null$field null$action null): Response
  829.     {
  830.         $params = ['id' => $id];
  831.         if ($field && $action) {
  832.             $params['field'] = $field;
  833.             $params['action'] = $action;
  834.             return $this->redirectToRoute('connect_startup_set_field_ajax'$params301);
  835.         }
  836.         return $this->redirectToRoute('connect_startup_set_field_data_ajax'$params301);
  837.     }
  838.     #[Route('/x/connect/startup/edit/{id}/{slug}'name'x_startup_edit')]
  839.     /**
  840.      * @IsGranted("ROLE_USER")
  841.      */
  842.     public function editStartupAction(Request $request$id$slug): Response
  843.     {
  844.         return $this->redirectToRoute('connect_startup_show', ['id' => $id'slug' => $slug'redirect' => $request->get('redirect')], 301);
  845.     }
  846.     private function removeOldResourcesFromCloudinary($uploadTag$link): void
  847.     {
  848.         $result $this->cloudinary->resources_by_tag($uploadTag);
  849.         $filter = fn ($res) => $res['secure_url'] != $link;
  850.         $oldRefs array_filter($result['resources'], $filter);
  851.         $oldIds array_map(fn ($res) => $res['public_id'], $oldRefs);
  852.         if (!empty($oldIds)) {
  853.             $result $this->cloudinary->delete_resources($oldIds);
  854.         }
  855.     }
  856.     #[Route('/startup-database/edit/{id}/{slug}'name'extern_startups_edit')]
  857.     /**
  858.      * @IsGranted("ROLE_USER")
  859.      */
  860.     public function editAction(Request $request$id$slug)
  861.     {
  862.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  863.         $redirectUrl $request->get('redirect');
  864.         /** @var Startup $startup */
  865.         if (!$startup $this->entityManager->getRepository(Startup::class)->findOneBy(['id' => $id])) {
  866.             $this->session->getFlashBag()->add('notice''ERROR 40 entity not found');
  867.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  868.         }
  869.         if ($slug != $startup->getSlug()) {
  870.             return $this->redirect($this->generateUrl('extern_startups_single', ['id' => $id'slug' => $startup->getSlug(), 'redirect' => $redirectUrl]));
  871.         }
  872.         $rightToAccessTeam false;
  873.         $team false;
  874.         $memberId 0;
  875.         $teamId $startup->getTeamId();
  876.         /** @var User $user */
  877.         if ($user $this->getUser()) {
  878.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  879.             $memberId $user->getMemberId();
  880.             if (!$member $this->entityManager->getRepository(Member::class)->findOneBy(['id' => $memberId])) {
  881.                 $this->session->getFlashBag()->add('notice''ERROR There is a problem with your account please contact support@startplatz.de');
  882.                 return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  883.             }
  884.             /** @var Team $team */
  885.             if ($team $this->entityManager->getRepository(Team::class)->findOneBy(['id' => $teamId])) {
  886.                 $rightToAccessTeam $this->entityManager->getRepository(MemberTeam::class)->checkAccessRight($member$team);
  887.             }
  888.         }
  889.         $admin $user->getIsAdmin();
  890.         if (!$rightToAccessTeam and !$admin) {
  891.             $this->session->getFlashBag()->add('notice''ERROR There is a problem with your account-3 please contact support@startplatz.de');
  892.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  893.         }
  894.         // the use of memberId is on purpose
  895.         $startupAttributes $this->entityManager->getRepository(StartupAttribute::class)->findOneBy(['startupId' => $startup->getId(), 'teamId' => $memberId]);
  896.         $this->entityManager->getRepository(StartupRelevance::class)->updateByUserAction($id'edit');
  897.         $rheinlandPitches $this->entityManager->getRepository(Application::class)->findBy(['startupId' => $id], ['batchId' => 'DESC']);
  898.         $fields Utility::getEntityFieldsArray($startup);
  899.         $storedData Utility::fillDataByObject($startup$fields);
  900.         $industries $this->entityManager->getRepository(Startup::class)->getListOfIndustries();
  901.         $form $this->createForm(StartupType::class, $startup, ['industries' => $industries'editForm' => 'extern']);
  902.         $form->handleRequest($request);
  903.         if ($form->isSubmitted() && $form->isValid()) {
  904.             $data $form->getData();
  905.             $updatedData Utility::fillDataByObject($startup$fields);
  906.             $differences array_diff_assoc($updatedData$storedData);
  907.             if ($differences) {
  908.                 $startup $this->entityManager->getRepository(Startup::class)->updateByEdit($startup$differences$user->getEmail());
  909.                 if ($team) {
  910.                     $team $this->entityManager->getRepository(Team::class)->syncDataWithStartup($team$startup);
  911.                 }
  912.             }
  913.         }
  914.         return $this->render('@StartPlatzAlphaBundle/Startup/edit.html.twig', [
  915.             'templateVars' => [],
  916.             'form' => $form->createView(),
  917.             'startup' => $startup,
  918.             'rightToAccessTeam' => $rightToAccessTeam,
  919.             'startupAttributes' => $startupAttributes,
  920.             'rheinlandPitches' => $rheinlandPitches,
  921.             'backUrl' => $redirectUrl,
  922.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  923.             'redirectUrl' => base64_encode(json_encode(['path' => 'extern_startups_single''parameters' => ['id' => $id'slug' => $startup->getSlug()]])),
  924.         ]);
  925.     }
  926.     #[Route('/startup-database/event/{id}/{slug}/{eventId}'name'extern_startups_event')]
  927.     /**
  928.      * @IsGranted("ROLE_USER")
  929.      */
  930.     public function startupLivecycleEventAction(Request $request$id$slug$eventId)
  931.     {
  932.                 $now = new DateTime();
  933.         $redirect json_decode(base64_decode((string) $request->get('redirect')));
  934.         $redirectUrl $request->get('redirect');
  935.         if (!$startup $this->entityManager->getRepository(Startup::class)->findOneBy(['id' => $id])) {
  936.             $this->session->getFlashBag()->add('notice''ERROR 50 entity not found');
  937.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  938.         }
  939.         if ($slug != $startup->getSlug()) {
  940.             return $this->redirect($this->generateUrl('extern_startups_single', ['id' => $id'slug' => $startup->getSlug(), 'redirect' => $redirectUrl]));
  941.         }
  942.         $rightToAccessTeam false;
  943.         $team false;
  944.         $memberId 0;
  945.         $teamId $startup->getTeamId();
  946.         /** @var User $user */
  947.         if ($user $this->getUser()) {
  948.             $this->entityManager->getRepository(User::class)->writeActivity($user);
  949.             $memberId $user->getMemberId();
  950.             if (!$member $this->entityManager->getRepository(Member::class)->findOneBy(['id' => $memberId])) {
  951.                 $this->session->getFlashBag()->add('notice''ERRORThere is a problem with your account please contact support@startplatz.de');
  952.                 return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  953.             }
  954.             if ($team $this->entityManager->getRepository(Team::class)->findOneBy(['id' => $teamId])) {
  955.                 $rightToAccessTeam $this->entityManager->getRepository(MemberTeam::class)->checkAccessRight($member$team);
  956.             }
  957.         }
  958.         $admin $user->getIsAdmin();
  959.         if (!$rightToAccessTeam and !$admin) {
  960.             $this->session->getFlashBag()->add('notice''ERROR There is a problem with your account-4 please contact support@startplatz.de');
  961.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  962.         }
  963.         // the use of memberId is on purpose
  964.         $startupAttributes $this->entityManager->getRepository(StartupAttribute::class)->findOneBy(['startupId' => $startup->getId(), 'teamId' => $memberId]);
  965.         $this->entityManager->getRepository(StartupRelevance::class)->updateByUserAction($id'edit');
  966.         $rheinlandPitches $this->entityManager->getRepository(Application::class)->findBy(['startupId' => $id], ['batchId' => 'DESC']);
  967.         $startupLivecycleEvents $this->entityManager->getRepository(StartupLifecycleEvent::class)->findBy(['startupId' => $startup->getId()], ['eventDate' => 'ASC']);
  968.         if (!$livecycleEvent $this->entityManager->getRepository(StartupLifecycleEvent::class)->findOneBy(['id' => $eventId])) {
  969.             $livecycleEvent = new StartupLifecycleEvent();
  970.             $livecycleEvent->setEventDate($now);
  971.             $livecycleEvent->setStartupId($id);
  972.         }
  973.         // set array oldData value, nr, text
  974.         $fields = ['eventWhat''eventDate''linkText''link'];
  975.         $oldData $this->getDataAsArray($fields$livecycleEvent);
  976.         $form $this->createForm(LivecycleEventType::class, $livecycleEvent);
  977.         $form->handleRequest($request);
  978.         if ($form->isSubmitted() && $form->isValid()) {
  979.             $newData $this->getDataAsArray($fields$livecycleEvent);
  980.             $differences array_diff_assoc($newData$oldData);
  981.             if ($differences) {
  982.                 $livecycleEvent $this->entityManager->getRepository(StartupLifecycleEvent::class)->updateByEdit($livecycleEvent$differences$user->getEmail());
  983.                 $this->session->getFlashBag()->add('notice''SUCCESSData has been saved');
  984.             }
  985.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  986.         }
  987.         return $this->render('@StartPlatzAlphaBundle/Startup/editLivecycleEvent.html.twig', [
  988.             'templateVars' => [],
  989.             'form' => $form->createView(),
  990.             'startup' => $startup,
  991.             'rightToAccessTeam' => $rightToAccessTeam,
  992.             'startupAttributes' => $startupAttributes,
  993.             'rheinlandPitches' => $rheinlandPitches,
  994.             'livecycleEvent' => $livecycleEvent,
  995.             'startupLivecycleEvents' => $startupLivecycleEvents,
  996.             'backUrl' => $redirectUrl,
  997.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  998.             'redirectUrl' => base64_encode(json_encode(['path' => 'extern_startups_single''parameters' => ['id' => $id'slug' => $startup->getSlug()]])),
  999.         ]);
  1000.     }
  1001.     #[Route('/startup-database/show-event/{id}/{slug}/{eventId}'name'extern_startups_show-event')]
  1002.     /**
  1003.      * @IsGranted("ROLE_USER")
  1004.      */
  1005.     public function showStartupLivecycleEventAction(Request $request$id$slug$eventId)
  1006.     {
  1007.                 $now = new DateTime();
  1008.         $redirect json_decode(base64_decode((string) $request->get('redirect')));
  1009.         $redirectUrl $request->get('redirect');
  1010.         if (!$startup $this->entityManager->getRepository(Startup::class)->findOneBy(['id' => $id])) {
  1011.             $this->session->getFlashBag()->add('notice''ERROR 60 entity not found');
  1012.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  1013.         }
  1014.         if ($slug != $startup->getSlug()) {
  1015.             return $this->redirect($this->generateUrl('extern_startups_single', ['id' => $id'slug' => $startup->getSlug(), 'redirect' => $redirectUrl]));
  1016.         }
  1017.         /** @var User $user */
  1018.         if (!$user $this->getUser()) {
  1019.             $this->session->getFlashBag()->add('notice''SUCCESSplease register or login');
  1020.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  1021.         }
  1022.         $this->entityManager->getRepository(User::class)->writeActivity($user);
  1023.         $this->entityManager->getRepository(StartupRelevance::class)->updateByUserAction($id'edit');
  1024.         if (!$startupLivecycleEvent $this->entityManager->getRepository(StartupLifecycleEvent::class)->findOneBy(['id' => $eventId])) {
  1025.             $this->session->getFlashBag()->add('notice''ERRORError - no event found');
  1026.             return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
  1027.         }
  1028.         return $this->render('@StartPlatzAlphaBundle/Startup/showLivecycleEvent.html.twig', [
  1029.             'templateVars' => [],
  1030.             'startup' => $startup,
  1031.             'startupLivecycleEvent' => $startupLivecycleEvent,
  1032.             'backUrl' => $redirectUrl,
  1033.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  1034.             'redirectUrl' => base64_encode(json_encode(['path' => 'extern_startups_single''parameters' => ['id' => $id'slug' => $startup->getSlug()]])),
  1035.         ]);
  1036.     }
  1037.     private function getDataAsArray($fields$entity)
  1038.     {
  1039.         foreach ($fields as $field) {
  1040.             $method 'get' ucfirst((string) $field);
  1041.             if (method_exists($entity$method)) {
  1042.                 if ($entity->$method() instanceof DateTime) {
  1043.                     $data[$field] = $entity->$method()->format('Y-m-d');
  1044.                 } else {
  1045.                     $data[$field] = $entity->$method();
  1046.                 }
  1047.             } else {
  1048.                 $data[$field] = "";
  1049.             }
  1050.         }
  1051.         return $data;
  1052.     }
  1053.     #[Route('/startup-database/get-in-contact/{id}'name'extern_startups_get-in-contact')]
  1054.     public function getInContactAjaxAction(Request $request$id)
  1055.     {
  1056.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  1057.         return $this->render('@StartPlatzAlphaBundle/Startup/modal.register.html.twig', [
  1058.             'title' => "Get in contact",
  1059.             'btnClass' => "btn-outline-info",
  1060.             'id' => $id,
  1061.             'redirect' => $redirect,
  1062.             'redirectUrl' => $request->get('redirect'),
  1063.         ]);
  1064.     }
  1065.     #[Route('/startup-database/register/{id}'name'extern_startups_register')]
  1066.     public function registerAjaxAction(Request $request$id)
  1067.     {
  1068.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  1069.         return $this->render('@StartPlatzAlphaBundle/Startup/modal.register.html.twig', [
  1070.             'title' => "Please register",
  1071.             'btnClass' => "btn-outline-info",
  1072.             'id' => $id,
  1073.             'redirect' => $redirect,
  1074.             'redirectUrl' => $request->get('redirect'),
  1075.         ]);
  1076.     }
  1077.     #[Route('/x/community/startups/missions/'name'x_startups_missions')]
  1078.     /**
  1079.      * @IsGranted("ROLE_USER")
  1080.      */
  1081.     public function indexMissionsForBadge(Request $request)
  1082.     {
  1083.                 $redirect json_decode(base64_decode((string) $request->get('redirect')));
  1084.         $redirectUrl $request->get('redirect');
  1085.         $templateVars $this->entityManager->getRepository(Startup::class)->getTemplateVars($request);
  1086.         /** @var User $user */
  1087.         $user $this->getUser();
  1088.         $this->entityManager->getRepository(User::class)->writeActivity($user'/x/community/startups/');
  1089.         $id $user->getTeamId();
  1090.         /** @var Team $team */
  1091.         $team $this->entityManager->getRepository(Team::class)->find($id);
  1092.         if (!$startup $this->entityManager->getRepository(Startup::class)->findOneBy(['id' => $team->getStartupId()])) {
  1093.             $startup = new Startup();
  1094.         } else {
  1095.             // increase relevance score every time a startup team is shown
  1096.             $this->entityManager->getRepository(StartupRelevance::class)->updateByUserAction($startup->getId(), 'click');
  1097.         }
  1098.         $lang $request->get('lang');
  1099.         $view '@StartPlatzAlphaBundle/Startup/index.missionsForBadge.html.twig';
  1100.         return $this->render($view, [
  1101.             'team' => $team,
  1102.             'startup' => $startup,
  1103.             'templateVars' => $templateVars,
  1104.             'backUrl' => $redirectUrl,
  1105.             'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
  1106.             'redirectUrl' => base64_encode(json_encode(['path' => 'website_startups_list''parameters' => $templateVars])),
  1107.         ]);
  1108.     }
  1109.     private function setEditorForm($content)
  1110.     {
  1111.         return $this->formFactory->createNamedBuilder('editor')
  1112.             ->add(
  1113.                 'content',
  1114.                 TinymceType::class,
  1115.                 [
  1116.                     'label' => 'Content',
  1117.                     'data' => $content,
  1118.                     'required' => false,
  1119.                 ]
  1120.             )
  1121.             ->add('save'SubmitType::class, ['label' => 'Save'])
  1122.             ->getForm();
  1123.     }
  1124.     private function setPlainEditorForm($content)
  1125.     {
  1126.         return $this->formFactory->createNamedBuilder('editor')
  1127.             ->add(
  1128.                 'content',
  1129.                 TextareaType::class,
  1130.                 [
  1131.                     'label' => 'Content',
  1132.                     'data' => $content,
  1133.                     'attr' => ['rows' => '17''cols' => '180'],
  1134.                     'required' => false,
  1135.                 ]
  1136.             )
  1137.             ->add('save'SubmitType::class, ['label' => 'Save'])
  1138.             ->getForm();
  1139.     }
  1140.     private function getSection($metaName)
  1141.     {
  1142.                 if (!$section $this->entityManager->getRepository(Option::class)->getOptionMetaValue($metaName)) {
  1143.             $section['fields'] = $this->setSectionFields();
  1144.             $section['content'][] = [
  1145.                 "https://www.startplatz.de/wp-content/uploads/2012/11/golfpost_225x225.jpg",
  1146.                 "http://www.golfpost.de",
  1147.                 "Golf Post",
  1148.                 "Das Online-Magazin Golf Post ist Vorreiter und inzwischen zur größten unabhängigen Golf-Plattform im deutschsprachigen Raum gereift. Ziel ist es, das elitäre Image des Golfsports zu entstauben.",
  1149.                 "#golfistbesseralsdudenkst #wirsindanders #unsereweltistgrün",
  1150.                 "99999",
  1151.             ];
  1152.             $this->entityManager->getRepository(Option::class)->setOptionMetaValueJsonEncoded($metaNamenull$section);
  1153.         }
  1154.         $section['entities'] = $this->setSectionEntities($section);
  1155.         return $section;
  1156.     }
  1157.     private function setSectionEntities($section)
  1158.     {
  1159.         $entities = [];
  1160.         foreach ($section['content'] as $row) {
  1161.             if ((is_countable($section['fields']) ? count($section['fields']) : 0) != (is_countable($row) ? count($row) : 0)) {
  1162.                 $i 0;
  1163.                 foreach ($section['fields'] as $field) {
  1164.                     $entity[$field] = $row[$i] ?? $field;
  1165.                     $i++;
  1166.                 }
  1167.                 $entities[] = $entity;
  1168.             } else {
  1169.                 $entities[] = array_combine($section['fields'], $row);
  1170.             }
  1171.         }
  1172.         return $entities;
  1173.     }
  1174.     private function transformArrayIntoCsvString($rows)
  1175.     {
  1176.         $content '';
  1177.         foreach ($rows as $row) {
  1178.             $content .= implode("\t"$row) . PHP_EOL;
  1179.         }
  1180.         return $content;
  1181.     }
  1182.     private function setSectionFields()
  1183.     {
  1184.         $fields = ['logo''url''name''desc''tags''teamId'];
  1185.         return $fields;
  1186.     }
  1187. }