<?php declare(strict_types=1);
namespace App\StartPlatz\Bundle\StartupBundle\Form;
use App\StartPlatz\Bundle\StartupBundle\Entity\Batch;
use Eckinox\TinymceBundle\Form\Type\TinymceType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\UrlType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ApplicationType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$data = $builder->getData();
$settings = $options['settings'];
$program = $options['program'];
/** @var Batch $batch */
$batch = $options['batch'];
switch ($batch->getTemplate()) {
case "membership":
case "membership-per-api":
$builder = $this->setBuilderProgramMembership($builder, $options);
break;
case "startup-tools":
$builder = $this->setBuilderProgramStartupTools($builder);
break;
case "accelerator":
$builder = $this->setBuilderProgramAccelerator($builder, $options);
break;
case "rheinland-pitch":
$builder = $this->setBuilderProgramRheinlandPitch($builder, $options);
break;
case "rheinland-pitch-web3":
$builder = $this->setBuilderProgramRheinlandPitchWeb3($builder, $options);
break;
case "gruenderstipendium":
if (isset($options['settings']['extraFields'])) {
$builder = $this->setBuilderExtraFields($builder, $options);
}
break;
case "registration":
case "businessclub":
case "event":
case "tiktok":
case "extraFields":
case "speed-networking":
$builder = $this->setBuilderProgramAccelerator($builder, $options);
$builder = $this->setBuilderTemplateRegistration($builder, $options);
if (isset($settings['applicantTypes']) && $settings['applicantTypes']) {
$builder = $this->setBuilderApplicantTypes($builder, $settings['applicantTypes']);
}
break;
case "nft":
$builder = $this->setBuilderNftRegistration($builder, $options);
break;
default:
if ($batch->getAccess() == 'anonymous' or $options['settings']['template'] == 'registration') {
$builder = $this->setBuilderProgramAccelerator($builder, $options);
$builder = $this->setBuilderTemplateRegistration($builder, $options);
} elseif ($options['settings']['isSignUp']) {
$builder
->add('firstName', TextType::class, ['required' => false, 'attr' => ['placeholder' => 'first name']])
->add('lastName', TextType::class, ['required' => false, 'attr' => ['placeholder' => 'last name']])
->add('person', TextType::class)
->add('email', EmailType::class)
->add('phone', TextType::class)
;
} elseif (isset($options['settings']['isEffzeh'])) {
$builder->add('ideaPitch', TextareaType::class, [
'label' => 'Content',
'required' => false,
]);
} else {
$builder = $this->setBuilderProgramRheinlandPitch($builder, $options);
}
break;
}
if (isset($options['settings']['extraFields'])) {
$builder = $this->setBuilderExtraFields($builder, $options);
}
$builder = $this->setBuilderSettingsIsPitchdeckRequired($builder, $options);
$builder = $this->setBuilderDefault($builder, $options, $batch);
$builder
->add('finish', SubmitType::class, ['label'=>'Apply now'])
;
}
private function setBuilderDefault(FormBuilderInterface $builder, $options, $batch)
{
if ($batch->getAskForTeam()) {
$builder
->add('startupName', TextType::class, ['required' => false, 'attr' => ['placeholder' => 'startupName']])
;
}
if ($batch->getHasIncludeLinkedIn()) {
$builder
->add('linkedin', UrlType::class, ['required' => false, 'default_protocol' => 'https', 'attr' => ['placeholder' => 'LinkedIn Url']])
;
}
if ($batch->getHasIncludeNewsletterPermission()) {
$builder
->add('hasNewsletterPermissionGiven', CheckboxType::class, ['required'=> false])
;
}
if (isset($options['settings']['hasIncludeVolunteerConsent']) && $options['settings']['hasIncludeVolunteerConsent']) {
$builder
->add('hasVolunteerAgreed', CheckboxType::class, ['required'=> false])
;
}
return $builder;
}
private function setBuilderProgramMembership(FormBuilderInterface $builder, $options)
{
$builder
->add('firstName', TextType::class, ['required' => false, 'attr' => ['placeholder' => 'first name']])
->add('lastName', TextType::class, ['required' => false, 'attr' => ['placeholder' => 'last name']])
->add('person', TextType::class, ['required' => false, 'attr' => ['placeholder' => 'name']])
->add('email', EmailType::class, ['required' => true, 'attr' => ['placeholder' => 'email']])
->add('recommendedBy', TextType::class, ['required'=> false])
;
return $builder;
}
private function setBuilderProgramStartupTools(FormBuilderInterface $builder)
{
$builder
->add('teamSize', TextType::class)
;
$builder->add('startupStage', ChoiceType::class, ['choices' => ['idea' => 'idea', 'seed' => 'seed', 'post-seed' => 'post-seed'], 'required' => true, 'empty_data' => 'idea']);
$builder->add('ideaPitch', TinymceType::class, [
'label' => 'Content',
'required' => false,
]);
return $builder;
}
private function setBuilderTemplateRegistration(FormBuilderInterface $builder, $options)
{
$builder
->add('firstName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'first name']])
->add('lastName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'last name']])
->add('email', EmailType::class, ['required' => true, 'attr' => ['placeholder' => 'email']])
;
return $builder;
}
private function setBuilderApplicantTypes(FormBuilderInterface $builder, $applicantTypes)
{
$choices = array_combine($applicantTypes, $applicantTypes);
$builder
//->add('applicantType', ChoiceType::class, ['choices' => $choices,'mapped' => false, 'required' => false, 'placeholder' => 'applicantType' ])
->add('applicantType', TextType::class, ['required' => true, 'attr' => ['placeholder' => implode(' or ', $applicantTypes)]])
;
return $builder;
}
private function setBuilderExtraFields(FormBuilderInterface $builder, $options)
{
$extraFields = $options['settings']['extraFields'];
foreach ($extraFields as $extraField) {
$required = $extraField['required'] == 'true' ? ' *' : '';
if ($extraField['type'] == 'choice') {
$choices = array_flip($extraField['choices']);
$builder
->add($extraField['field'], ChoiceType::class, ['choices' => $choices,'mapped' => false, 'required' => false, 'placeholder' => $extraField['label'] . $required ])
;
} elseif ($extraField['type'] == 'checkbox') {
$builder
->add($extraField['field'], CheckboxType::class, ['required' => false,'mapped' => false, 'attr' => ['placeholder' => $extraField['label'] . $required ]])
;
} elseif ($extraField['type'] == 'textarea') {
$builder
->add($extraField['field'], TextareaType::class, ['required' => false,'mapped' => false, 'attr' => ['placeholder' => $extraField['label'] . $required ]])
;
} else {
$builder
->add($extraField['field'], TextType::class, ['required' => false,'mapped' => false, 'attr' => ['placeholder' => $extraField['label'] . $required ]])
;
}
}
return $builder;
}
private function setBuilderNftRegistration(FormBuilderInterface $builder, $options)
{
$builder
->add('firstName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'first name']])
->add('lastName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'last name']])
->add('email', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'email']])
->add('linkedin', UrlType::class, ['required' => true, 'default_protocol' => 'https', 'attr' => ['placeholder' => 'linkedin']])
->add('wallet', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'wallet']])
;
return $builder;
}
private function setBuilderProgramRheinlandPitch(FormBuilderInterface $builder, $options)
{
$builder
->add('firstName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'first name']])
->add('lastName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'last name']])
->add('email', EmailType::class, ['required' => true, 'attr' => ['placeholder' => 'email']])
->add('phone', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'phone number']])
->add('teamSize', TextType::class)
->add('city', TextType::class)
->add('websiteUrl', TextType::class, ['required'=> true])
;
$builder->add('startupStage', ChoiceType::class, ['choices' => ['idea' => 'idea', 'seed' => 'seed', 'post-seed' => 'post-seed'], 'required' => true, 'empty_data' => 'idea']);
$builder->add('ideaPitch', TextareaType::class,
[
'attr' => ['rows' => '34', 'cols' => '180'],
'required' => true,
]
);
/*
'plugins' => "blocks advlist autolink link image media table lists code format",
'toolbar' => "blocks bold italic underline | bullist numlist | table quickimage link code format",
$builder->add('ideaPitch',TextareaType::class, ['required' => true, 'attr' => ['placeholder' => 'one sentence pitch']])
;
*/
$builder->add('industry', ChoiceType::class, array(
'choices' => array_flip($options['settings']['industries']),
'required' => true,
'placeholder' => 'Choose an option',
'empty_data' => 'Other',
));
/*
* [
'Female Founders' => 'Female Founders',
'EdTech' => 'EdTech',
'Digital Health' => 'Digital Health',
]
[
'Generative AI' => 'Generative AI',
'Climate Tech' => 'Climate Tech',
'Digital Health' => 'Digital Health',
]
*/
//
return $builder;
}
private function setBuilderProgramRheinlandPitchWeb3(FormBuilderInterface $builder, $options)
{
$builder
->add('firstName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'first name']])
->add('lastName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'last name']])
->add('email', EmailType::class, ['required' => true, 'attr' => ['placeholder' => 'email']])
->add('phone', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'phone number']])
->add('teamSize', TextType::class)
->add('city', TextType::class)
->add('linkedin', UrlType::class, ['required'=> true, 'default_protocol' => 'https'])
->add('telegram', TextType::class, ['required'=> false])
->add('discord', TextType::class, ['required'=> false])
->add('websiteUrl', TextType::class, ['required'=> true])
;
$builder->add('startupStage', ChoiceType::class, ['choices' => ['idea' => 'idea', 'seed' => 'seed', 'post-seed' => 'post-seed'], 'required' => true, 'empty_data' => 'idea']);
$builder->add('ideaPitch', TinymceType::class, [
'label' => 'Content',
'width' => '100%',
'required' => false,
]);
/*
$builder->add('ideaPitch',TextareaType::class, ['required' => true, 'attr' => ['placeholder' => 'one sentence pitch']])
;
*/
$builder->add('industry', ChoiceType::class, ['choices' => array_flip($options['settings']['industries']), 'required' => true, 'placeholder' => 'Choose an option', 'empty_data' => 'Other']);
$builder->add('projectCategory', ChoiceType::class, ['choices' => array_flip($options['settings']['project-category']), 'required' => true, 'placeholder' => 'Choose an option', 'empty_data' => 'Other']);
$builder->add('blockchain', ChoiceType::class, ['choices' => array_flip($options['settings']['blockchain']), 'required' => true, 'placeholder' => 'Choose an option', 'empty_data' => 'Other']);
return $builder;
}
private function setBuilderProgramAccelerator(FormBuilderInterface $builder, $options)
{
$builder
->add('firstName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'first name (*)']])
->add('lastName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'last name (*)']])
->add('email', EmailType::class, ['required' => true, 'attr' => ['placeholder' => 'email (*)']])
->add('phone', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'phone number (*)']])
->add('teamSize', TextType::class)
->add('city', TextType::class)
->add('websiteUrl', TextType::class, ['required'=> true])
->add('fulltime', TextType::class, ['required'=> true])
->add('language', ChoiceType::class, [
'choices' => [
"Deutsch" => "Deutsch",
"English" => "English",
],
'placeholder' => 'Choose an option',
'empty_data' => "Deutsch",
'required' => true,
])
->add('mvpStatus', ChoiceType::class, [
'choices' => [
"Yes" => "Yes",
"Almost, it will be ready when the program starts" => "Almost, it will be ready when the program starts",
"No" => "No",
],
'placeholder' => 'Choose an option',
'empty_data' => "Yes",
'required' => true,
])
;
$builder
->add('dealroomUrl', TextType::class, ['required' => false, 'attr' => ['placeholder' => 'dealroom url']])
;
$builder->add('ideaPitch', TextareaType::class, ['required' => true, 'attr' => ['placeholder' => 'one sentence pitch']])
;
/*
$builder->add('ideaPitch', TinymceType::class, [
'label' => 'Content',
'required' => false
]);
*/
$builder->add('industry', ChoiceType::class, ['choices' => array_flip($options['settings']['industries']), 'required' => true, 'placeholder' => 'Choose an option', 'empty_data' => 'Other']);
return $builder;
}
private function setBuilderSettingsIsPitchdeckRequired(FormBuilderInterface $builder, $options)
{
if ($options['settings']['isPitchDeckRequired']) {
$builder
->add('uploadImage', SubmitType::class, ['label' => 'Upload pitch deck']);
$builder->add('save', SubmitType::class, ['label' => 'save']);
}
return $builder;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults(['data_class' => \App\StartPlatz\Bundle\StartupBundle\Entity\Application::class, 'settings' => false, 'program' => false, 'batch' => false]);
}
/**
* @return string
*/
public function getBlockPrefix()
{
return 'startplatz_bundle_startupbundle_application';
}
}