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

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