<?php declare(strict_types=1);
namespace App\StartPlatz\Bundle\AlphaBundle\Controller;
use App\StartPlatz\Bundle\AlphaBundle\Entity\Actor;
use App\StartPlatz\Bundle\AlphaBundle\Entity\Feed;
use App\StartPlatz\Bundle\AlphaBundle\Entity\Page;
use App\StartPlatz\Bundle\AlphaBundle\Entity\Post;
use App\StartPlatz\Bundle\MemberBundle\Entity\Member;
use App\StartPlatz\Bundle\MetaBundle\Entity\Attribute;
use App\StartPlatz\Bundle\UserBundle\Entity\User;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Routing\Annotation\Route;
use App\StartPlatz\Bundle\WebsiteBundle\MenuTranslationService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class BenefitController extends AbstractController
{
public function __construct(
private readonly SessionInterface $session,
private readonly MenuTranslationService $menuTranslationService
) {
}
/**
* @Route("/x/startup-tools/home", name="x_startup-tools_home")
* @Route("/benefits/perks", name="benefits_perks")
* @Route("/en/benefits/perks", name="benefits_perks_english")
*/
public function startupToolsAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$redirect = json_decode(base64_decode((string)$request->get('redirect')));
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
$member = $em->getRepository(Member::class)->find($user->getMemberId());
}
$pageType = "startup-tool";
$parentSlug = "startup-tools";
$pageRepository = $em->getRepository(Page::class);
if (!$parentPage = $pageRepository->findOneBy(['slug' => $parentSlug])) {
$parentPage = new Page();
$parentPage->setTitle('Tools');
$parentPage->setTeaser('Welcome');
$parentPage->setDescription('Our Startup Tools are software solutions that can help to scale up your business. Each of our software solutions has an exclusive community-discount. We will continuously add more benefits to our portfolio. In case your prefered tool is not represented here: please do not hesitate to contact us and help us improve our benefits Contact our team.');
}
$ajax = $request->get('ajax');
$limit = 3;
if (!$page = $request->get('page')) {
$page = 1;
}
$criteria = ['type' => $pageType, 'isActive' => 1, 'status' => 'publish'];
$items = $pageRepository->findPaginated($criteria, [], $page, $limit);
$total = $pageRepository->countByCriteria($criteria);
$route = $request->get('_route');
$path = $request->getPathInfo();
$lang = 'DE';
if (str_starts_with($path, "/en/")) {
$lang = 'EN';
}
$viewFeed = '@StartPlatzAlphaBundle/Benefit/StartupTools__feed.twig';
if ($route == 'x_startup-tools_home') {
$view = '@StartPlatzAlphaBundle/Benefit/StartupTools__index.twig';
} else {
$view = '@StartPlatzAlphaBundle/Benefit/StartupTools__index__homepage.twig';
}
if ($ajax) {
return $this->render($viewFeed, [
'items' => $items,
'lang' => $lang,
'maxPages' => ceil($total / $limit),
'thisPage' => $page,
'ajax' => $ajax,
'templateVars' => [],
'redirectUrl' => base64_encode(json_encode(['path' => 'x_startup-products_home', 'parameters' => []])),
]);
}
return $this->render($view, [
'items' => $items,
'parentPage' => $parentPage,
'path' => $path,
'lang' => $lang,
'maxPages' => ceil($total / $limit),
'thisPage' => $page,
'ajax' => $ajax,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_startup-tools_home', 'parameters' => []])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
/**
* @Route("/x/software-for-startups/{id}/{slug}", name="x_startup-tools_single")
*/
public function startupToolSingleAction(Request $request, $id, $slug)
{
$em = $this->getDoctrine()->getManager();
$redirect = json_decode(base64_decode((string)$request->get('redirect')));
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
}
$pageRepository = $em->getRepository(Page::class);
$item = $pageRepository->findOneBy(['id' => $id]);
$feedItems = [];
$entities = [];
if ($item->getFeedTags()) {
$feedItems = $em->getRepository(Feed::class)->findByFeedTag($item->getFeedTags());
$entities = $em->getRepository(Feed::class)->getEntitiesByFeedItems($feedItems);
}
$pageType = 'startup-tool';
$lang = "EN";
$titles = $pageRepository->getPageTexts($pageType, $lang);
return $this->render('@StartPlatzAlphaBundle/Benefit/single.startupTools.html.twig', [
'id' => $id,
'item' => $item,
'feedItems' => $feedItems,
'entities' => $entities,
'pageType' => $pageType,
'lang' => $lang,
'titles' => $titles,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_startup-tools_home', 'parameters' => []])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
/**
* @Route("/x/benefits/home", name="x_benefits_home")
*/
public function benefitsAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$redirect = json_decode(base64_decode((string)$request->get('redirect')));
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
}
$pageRepository = $em->getRepository(Page::class);
$templateVars = $pageRepository->getTemplateVars($request);
$orderBy = $templateVars['dimensions'] ?: ['title' => 'ASC'];
$pageTypes = $em->getRepository(Attribute::class)->findBy([
'name' => 'page.type',
'parent' => 'benefit',
]);
$types = array_map(fn ($result) => $result->getCode(), $pageTypes);
$criteria = ['partners' => array_keys($types)] + $templateVars['criteria'];
if (!$parentPage = $pageRepository->findOneBy(['slug' => 'benefits-all'])) {
$parentPage = new Page();
$parentPage->setTitle('STARTPLATZ Benefits');
$parentPage->setTeaser('Welcome');
$parentPage->setDescription('empty');
}
$ajax = $request->get('ajax');
$limit = 300;
if (!$page = $request->get('page')) {
$page = 1;
}
$items = $pageRepository->findPaginated($criteria, $orderBy, $page, $limit);
$maxPages = $pageRepository->countByCriteria($criteria);
if ($ajax) {
return $this->render('@StartPlatzAlphaBundle/Benefit/Benefits__Feed.twig', [
'items' => $items,
'pageTypes' => $pageTypes,
'maxPages' => $maxPages,
'thisPage' => $page,
'ajax' => $ajax,
'limit' => $limit,
'templateVars' => [],
'redirectUrl' => base64_encode(json_encode(['path' => 'x_startup-products_home', 'parameters' => []])),
]);
}
return $this->render('@StartPlatzAlphaBundle/Benefit/Benefits__index.twig', [
'items' => $items,
'parentPage' => $parentPage,
'pageTypes' => $pageTypes,
'maxPages' => $maxPages,
'thisPage' => $page,
'ajax' => $ajax,
'limit' => $limit,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_startup-products_home', 'parameters' => []])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
/**
* @Route("/x/startup-products/home", name="x_startup-products_home")
*/
public function startupProductAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$redirect = json_decode(base64_decode((string)$request->get('redirect')));
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
$member = $em->getRepository(Member::class)->find($user->getMemberId());
} else {
$member = $em->getRepository(Member::class)->setEmptyMemberAccount();
}
$pageType = "startup-product-partner";
$parentSlug = "startup-products";
$pageRepository = $em->getRepository(Page::class);
if (!$parentPage = $pageRepository->findOneBy(['slug' => $parentSlug])) {
$parentPage = new Page();
$parentPage->setTitle('Products');
$parentPage->setTeaser('Welcome');
$parentPage->setDescription(' <p>Wir zeigen hier Produkte, die andere Startups geschaffen haben und die nützlich für die Mitglieder unserer Community sind. Das können Alltagsp â–¶
Wir werden über die nächsten Wochen Produkt-Partner suchen, sie portraitieren und die Produkte hier vorstellen. Wenn Du auch Produkt-Partner werden wi â–¶
');
}
$ajax = $request->get('ajax');
$limit = 3;
if (!$page = $request->get('page')) {
$page = 1;
}
$visibilityStatuses = [
'Public' => 'public',
'SP-Connect' => 'sp-connect',
'Admin only' => 'admin',
];
$allowedVisibility = ['sp-connect', 'public'];
$criteria = ['type' => $pageType, 'visibility' => $allowedVisibility, 'status' => 'publish'];
$items = $pageRepository->findPaginated($criteria, [], $page, $limit);
$maxPages = $pageRepository->countByCriteria($criteria);
$viewFeed = '@StartPlatzAlphaBundle/Benefit/StartupProduct__feed.twig';
$view = '@StartPlatzAlphaBundle/Benefit/StartupProducts__index.twig';
if ($ajax) {
return $this->render($viewFeed, [
'items' => $items,
'userMember' => $member,
'maxPages' => $maxPages,
'thisPage' => $page,
'ajax' => $ajax,
'templateVars' => [],
'redirectUrl' => base64_encode(json_encode(['path' => 'x_startup-products_home', 'parameters' => []])),
]);
}
return $this->render($view, [
'items' => $items,
'parentPage' => $parentPage,
'userMember' => $member,
'maxPages' => $maxPages,
'thisPage' => $page,
'ajax' => $ajax,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_startup-products_home', 'parameters' => []])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
/**
* @Route("/x/startup-products/single/{id}", name="x_startup-products_single")
*/
public function startupProductSingleAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
if (!$redirect = json_decode(
base64_decode((string)$request->get('redirect'))
)) {
$redirect = json_decode(
json_encode(['path' => 'x_startup-products_home', 'parameters' => []])
);
}
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
$userMember = $em->getRepository(Member::class)->find($user->getMemberId());
} else {
$userMember = $em->getRepository(Member::class)->setEmptyMemberAccount();
}
if (!$item = $em->getRepository(Page::class)->findOneBy(['id' => $id])) {
$this->session->getFlashBag()->add('notice', 'ERROR 084: page not found');
return $this->redirect($this->generateUrl($redirect->path, (array)$redirect->parameters));
}
$feedItems = [];
$entities = [];
if ($item->getFeedTags() and !$item->getFeedTags() == '["no tag wanted"]') {
$feedItems = $em->getRepository(Feed::class)->findByFeedTag($item->getFeedTags());
$entities = $em->getRepository(Feed::class)->getEntitiesByFeedItems($feedItems);
}
if (!$parentPage = $em->getRepository(Page::class)->findOneBy(['slug' => 'startup-products'])) {
$parentPage = new Page();
$parentPage->setTitle('Startup Products');
$parentPage->setTeaser('Welcome');
$parentPage->setDescription(' <p>Wir zeigen hier Produkte, die andere Startups geschaffen haben und die nützlich für die Mitglieder unserer Community sind. Das können Alltagsp â–¶
Wir werden über die nächsten Wochen Produkt-Partner suchen, sie portraitieren und die Produkte hier vorstellen. Wenn Du auch Produkt-Partner werden wi â–¶
');
}
$pageType = 'startup-product-partner';
$lang = "DE";
$titles = $em->getRepository(Page::class)->getPageTexts($pageType, $lang);
return $this->render('@StartPlatzAlphaBundle/Benefit/single.startupProducts.html.twig', [
'id' => $id,
'item' => $item,
'feedItems' => $feedItems,
'entities' => $entities,
'pageType' => $pageType,
'lang' => $lang,
'titles' => $titles,
'parentPage' => $parentPage,
'userMember' => $userMember,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_startup-products_home', 'parameters' => []])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
/**
* @Route("/x/pages/{pageType}/single/{id}/{slug}", name="x_page_single")
*/
public function pageSingleAction(Request $request, $pageType, $id, $slug)
{
$em = $this->getDoctrine()->getManager();
$redirect = json_decode(base64_decode((string)$request->get('redirect')));
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
}
/** @var Page $page */
$page = $em->getRepository(Page::class)->findOneBy(['id' => $id]);
$title = $page->getTitle();
$pageTag = $page->getSlug();
$feedItems = [];
$entities = [];
if ($page->getFeedTags()) {
$feedItems = $em->getRepository(Feed::class)->findByFeedTag($page->getFeedTags());
$entities = $em->getRepository(Feed::class)->getEntitiesByFeedItems($feedItems);
}
$lang = "DE";
$titles = $em->getRepository(Page::class)->getPageTexts($pageType, $lang);
return $this->render('@StartPlatzAlphaBundle/Benefit/single.page.html.twig', [
'id' => $id,
'item' => $page,
'feedItems' => $feedItems,
'entities' => $entities,
'pageType' => $pageType,
'lang' => $lang,
'titles' => $titles,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_page_single', 'parameters' => ['id' => $id, 'slug' => $slug],])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
/**
* @Route("/x/service-partner/home", name="x_service-partner_home")
* @Route("/benefits/service-partner", name="hp_service-partner")
* @Route("/en/benefits/service-partner", name="hp_service-partner_english")
*/
public function servicePartnerAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$redirect = json_decode(base64_decode((string)$request->get('redirect')));
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
$member = $em->getRepository(Member::class)->find($user->getMemberId());
} else {
$member = $em->getRepository(Member::class)->setEmptyMemberAccount();
}
$pageRepository = $em->getRepository(Page::class);
if (!$parentPage = $pageRepository->findOneBy(['slug' => 'service-partner'])) {
$parentPage = new Page();
$parentPage->setTitle('Service Partner');
$parentPage->setTeaser('Welcome');
$parentPage->setDescription('Hier sind unsere Partner aufgelistet, die Dir helfen, Dein Business zu verbessern.');
}
$ajax = $request->get('ajax');
$limit = 18;
if (!$page = $request->get('page')) {
$page = 1;
}
if ($topic = $request->get('topic')) {
$criteria = ['partners' => ['service-partner'], 'tags' => $topic, 'isActive' => 1, 'status' => 'publish'];
} else {
$criteria = ['partners' => ['service-partner'], 'isActive' => 1, 'status' => 'publish'];
}
$partners = $pageRepository->findPaginated($criteria, [], $page, $limit);
$total = $pageRepository->countByCriteria($criteria);
$path = $request->getPathInfo();
$lang = 'DE';
if (str_starts_with($path, "/en/")) {
$lang = 'EN';
}
if (!$pageType = $request->get('pageType')) {
$pageType = 'service-partner';
}
$titles = $pageRepository->getPageTexts($pageType, $lang);
$pageTypes = $pageRepository->getPageTypes();
$route = $request->get('_route');
if ($route == 'x_service-partner_home') {
$view = '@StartPlatzAlphaBundle/Benefit/ServicePartner__index.twig';
$viewFeed = '@StartPlatzAlphaBundle/Benefit/ServicePartner__Feed.twig';
} else {
$view = '@StartPlatzAlphaBundle/Benefit/index.servicePartners.homepage.html.twig';
$viewFeed = '@StartPlatzAlphaBundle/Benefit/_feed.servicePartners.homepage.html.twig';
}
if ($ajax) {
return $this->render($viewFeed, [
'partners' => $partners,
'pageType' => $pageType,
'pageTypes' => $pageTypes,
'lang' => $lang,
'titles' => $titles,
'topic' => $topic,
'userMember' => $member,
'maxPages' => ceil($total / $limit),
'thisPage' => $page,
'ajax' => $ajax,
'limit' => $limit,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_service-partner_home', 'parameters' => []])),
'templateVars' => [],
]);
}
return $this->render($view, [
'partners' => $partners,
'pageType' => $pageType,
'pageTypes' => $pageTypes,
'lang' => $lang,
'titles' => $titles,
'total' => $total,
'parentPage' => $parentPage,
'topic' => $topic,
'userMember' => $member,
'maxPages' => ceil($total / $limit),
'thisPage' => $page,
'ajax' => $ajax,
'limit' => $limit,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_service-partner_home', 'parameters' => []])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
/**
* @Route("/x/service-partner/single/{id}/{slug}", name="x_service-partner_single")
* @Security("is_granted('ROLE_USER')")
*/
public function servicePartnerSingleAction(Request $request, $id, $slug)
{
$em = $this->getDoctrine()->getManager();
$redirect = json_decode(base64_decode((string)$request->get('redirect')));
/** @var User $user */
if ($user = $this->getUser()) {
$em->getRepository(User::class)->writeActivity($user);
$member = $em->getRepository(Member::class)->find($user->getMemberId());
} else {
$member = $em->getRepository(Member::class)->setEmptyMemberAccount();
}
$item = $em->getRepository(Page::class)->findOneBy(['id' => $id]);
$pageTag = $item->getSlug();
$feedItems = [];
$entities = [];
$feedTagsArray = json_decode((string)$item->getFeedTags(), true);
$feedTagsArray[] = $item->getSlug();
$feedTags = json_encode(array_values(array_unique($feedTagsArray)));
if ($feedTags) {
$feedItems = $em->getRepository(Feed::class)->findByFeedTag($feedTags);
$entities = $em->getRepository(Feed::class)->getEntitiesByFeedItems($feedItems);
}
/** @var Member $contactPartner */
$contactPartner = $em->getRepository(Member::class)->findOneBy(['id' => $item->getContactPartnerMemberId()]);
$actors = $em->getRepository(Actor::class)->findActorsByFeedTag($pageTag);
$pageType = $item->getType();
$lang = "DE";
$titles = $em->getRepository(Page::class)->getPageTexts($pageType, $lang);
$faqs = $em->getRepository(Post::class)->findBy([
'type' => 'faq',
'teamId' => $item->getTeamId(),
], ['score' => 'DESC']);
$faqsByTopic = [];
foreach ($faqs as $faq) {
$category = ucfirst((string)$faq->getCategories());
array_key_exists($category, $faqsByTopic) ? array_push(
$faqsByTopic[$category],
$faq
) : $faqsByTopic[$category] = [$faq];
}
return $this->render('@StartPlatzAlphaBundle/Benefit/single.servicePartner.html.twig', [
'id' => $id,
'item' => $item,
'page' => $item,
'feedItems' => $feedItems,
'actors' => $actors,
'feedTags' => $feedTags,
'entities' => $entities,
'pageType' => $pageType,
'lang' => $lang,
'titles' => $titles,
'contactPartner' => $contactPartner,
'allowEdit' => false,
'userMember' => $member,
'faqsByTopic' => $faqsByTopic,
'redirectUrl' => base64_encode(json_encode(['path' => 'x_service-partner_single', 'parameters' => ['id' => $id, 'slug' => $slug],])),
'templateVars' => [],
'menuLinksAndPhrases' => $this->menuTranslationService->getMenuLinksAndPhrases($request->server->get('REQUEST_URI')),
]);
}
}