<?php
/**
* Created by PhpStorm.
* User: michael
* Date: 24/04/2019
* Time: 12:06
*/
namespace App\Form;
use App\Entity\Store;
use App\Form\Type\RadioButtonChoiceType;
use App\Service\GmapsService;
use App\Service\RefereeService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Sonata\AdminBundle\Form\Type\CollectionType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use App\Entity\ProspectOnStore;
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\DateType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\RadioType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;
class ProspectType extends AbstractType
{
protected $gmapsService;
protected $refereeService;
private $entityManager;
public function __construct(GmapsService $gmapsService, RefereeService $refereeService, EntityManagerInterface $entityManager)
{
$this->gmapsService = $gmapsService;
$this->refereeService = $refereeService;
$this->entityManager = $entityManager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
// WARNING : Deux formulaires (avec et sans étape)
if(isset($options['flow_step'])) {
// formulaire avec étape
switch ($options['flow_step']) {
case 1:
$builder
->add('lastname', TextType::class, [
'label' => false,
'attr' => [
'placeholder' => 'Nom'
]
])
->add('firstname', TextType::class, [
'label' => false,
'attr' => [
'placeholder' => 'Prénom',
]
])
->add('phoneNumber', TelType::class, [
'label' => false,
'attr' => [
'placeholder' => 'Téléphone',
'class' => 'cleave-phone-number'
]
])
->add('email', EmailType::class, [
'label' => false,
'attr' => [
'placeholder' => 'Email'
],
])
->add('yearOfBirth', IntegerType::class, [
'label' => false,
'attr' => [
'placeholder' => 'Année de naissance',
'class' => 'cleave-year-of-birth hide-number-input'
],
])
->add('address', TextType::class, [
'label' => false,
'attr' => [
'placeholder' => 'Adresse'
],
])
->add('postalcode', IntegerType::class, [
'label' => false,
'attr' => [
'placeholder' => 'Code postal',
'class' => 'cleave-postal-code autocomplete-postal-code hide-number-input'
],
])
->add('city', TextType::class, [
'label' => false,
'attr' => [
'placeholder' => 'Ville',
'class' => 'autocomplete-city'
],
])
->add('is_orl_prescription', RadioButtonChoiceType::class, [
'required' => true,
'choices' => [
'Oui' => '1',
'Non' => '0'
],
'label' => 'Avez-vous une ordonnance ORL ?',
'attr' => ['class' => 'form-inline form-check-input']
])
->add('is_privacy', CheckboxType::class, [
'label' => 'J\'accepte la politique de protection des données personnelles',
])
->add('is_optin', CheckboxType::class, [
'label' => 'J\'accepte de recevoir par e-mail ou sms les offres et actualités de Mon Centre Auditif',
'required' => false,
])
->add('is_partner_offer', CheckboxType::class, [
'label' => 'J’accepte de recevoir des offres commerciales de la part du ou des partenaires audioprothésistes.',
'required' => false,
]);
break;
case 2:
$fullAddress = $options['data']->getAddress() . ' ' . $options['data']->getPostalCode() . ' ' . $options['data']->getCity();
$geocode = $this->gmapsService->getLatitudeLongitudeFromAddress($fullAddress);
// récupérer les 3 centres les plus proches de l'adresse de l'utilisateur
/*
* SELECTION MCA
*/
// Application de l'algorithme de trie (SAW) sur les stores clients MCA
$storeBySaw = $this->refereeService->sawAnalysisFunction($geocode[0], $geocode[1], Store::AREA_SEARCH, Store::WEIGHT_LEAD_COST, Store::WEIGHT_RATIO_CAPPING, Store::WEIGHT_DISTANCE);
if($storeBySaw === null) {
$wideAreaDistance = Store::AREA_SEARCH + 50;
$storeBySaw = $this->refereeService->sawAnalysisFunction($geocode[0], $geocode[1], $wideAreaDistance, Store::WEIGHT_LEAD_COST, Store::WEIGHT_RATIO_CAPPING, Store::WEIGHT_DISTANCE);
}
$i = 0;
$tabStore = [];
$tabDistance = [];
while ($i < count($storeBySaw)) {
$tabStore[] = $storeBySaw[$i]['store'];
$tabDistance[] = [$i => $storeBySaw[$i]['distance_reel']];
if($i >= Store::NUM_TOP_CLIENT_STORE - 1) {
break;
}
++$i;
}
$builder
->add('prospectsOnStore', ChoiceType::class, [
'choices' => $tabStore,
'choice_value' => function ($entity = null) {
return ($entity instanceof Store) ? $entity->getId() : '';
},
'choice_attr' => $tabDistance,
'label' => false,
'expanded' => true,
'multiple' => false,
'mapped' => false,
'attr' => [
'class' => 'sr-only'
],
'preferred_choices' => [$tabStore[0]],
'data' => 0
])
->add('prospect_id', null, [
'mapped' => false,
'data' => $options['data']->getId(),
'label' => false,
'attr' => [
'hidden' => true
],
])
;
break;
/*$builder
->add('prospectsOnStore', EntityType::class, array(
'multiple' => true, // Multiple selection allowed
'expanded' => true, // Render as checkboxes
'class' => Store::class,
'label' => false,
'choice_label' => function (Store $store) {
return ' ';
},
'choice_attr' => function($choice, $key, $value) {
// adds a class like attending_yes, attending_no, etc
return ['address' . '/' . $choice . '/' . $key];
},
'query_builder' => function (EntityRepository $er) use ($options, $geocode) {
$results = $er->createQueryBuilder('s')
->select('h, s')
->join('s.hearingBrand', 'h')
->andwhere('s.zipCode = :zipcode')
->andwhere('s.state = :state')
->setParameters(['zipcode' => $options['data']->getPostalcode(), 'state' => 'valid'])
->addGroupBy('h.id')
->setMaxResults('3')
;
return $results;
},
'mapped' => false,
));
break;*/
}
} else {
// formulaire sans étape
$builder
->add('firstname', TextType::class, [
'label' => 'Prénom',
'required' => true,
'attr' => [
//'placeholder' => 'Eric'
'placeholder' => 'Prénom'
]
])
->add('lastname', TextType::class, [
'label' => 'Nom' ,
'attr' => [
//'placeholder' => 'BOIS'
'placeholder' => 'Nom'
]
])
->add('phoneNumber', TelType::class, [
'label' => 'Téléphone',
'attr' => [
//'placeholder' => '06 57 34 57 00',
'placeholder' => 'Téléphone',
'class' => 'cleave-phone-number'
]
])
->add('email', TextType::class, [
'label' => 'Email',
'attr' => [
'placeholder' => 'Email'
//'placeholder' => 'eric.bois@gmail.com'
]
])
->add('yearOfBirth', IntegerType::class, [
'label' => 'Année de naissance',
'attr' => [
//'placeholder' => '1996',
'placeholder' => 'Année de naissance',
'class' => 'cleave-year-of-birth hide-number-input'
]
])
->add('address', TextType::class, [
'label' => 'Adresse',
'attr' => [
//'placeholder' => '124 rue Lamarck'
'placeholder' => 'Adresse'
],
])
->add('postalcode', TelType::class, [
'label' => 'Code postal',
'attr' => [
//'placeholder' => '75018',
'placeholder' => 'Code postal',
'class' => 'cleave-postal-code autocomplete-postal-code hide-number-input',
'list' => 'output',
],
])
->add('city', TextType::class, [
'label' => 'Ville',
'attr' => [
//'placeholder' => 'Paris',
'placeholder' => 'Ville',
'class' => 'autocomplete-city'
],
])
->add('is_orl_prescription', RadioButtonChoiceType::class, [
'required' => true,
'choices' => [
'Oui' => '1',
'Non' => '0'
],
'label' => 'Avez-vous une ordonnance ORL ?',
'attr' => ['class' => 'form-inline my-3']
])
->add('is_privacy', CheckboxType::class, [
'label' => 'J\'accepte la politique de protection des données personnelles',
'constraints' => array(
new \Symfony\Component\Validator\Constraints\NotBlank(['message' => 'Champ obligatoire']),
),
'attr' => [
'placeholder' => 'Accepter',
]
])
->add('is_optin', CheckboxType::class, [
'label' => 'J\'accepte de recevoir par e-mail ou sms les offres et actualités de Mon Centre Auditif',
'required' => false,
])
->add('submit', SubmitType::class, [
'label' => 'Je valide ma demande',
'attr' => [
'class' => 'w-100 btn btn-success'
]
])
->add('is_partner_offer', CheckboxType::class, [
'label' => 'J’accepte de recevoir des offres commerciales de la part du ou des partenaires audioprothésistes.',
'required' => false,
])
;
}
}
public function getBlockPrefix() {
return 'prospectTypeStep1';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'csrf_protection' => true,
'csrf_field_name' => '_token',
// important part; unique key
'csrf_token_id' => 'prospect_token',
]);
}
}