<?php
namespace App\Form;
use App\Entity\Privatisation;
use App\Entity\InterfaceReservation;
use App\Form\ExtraReservationCollectionType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class PrivatisationType extends AbstractType
{
private $translator;
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('nbParticipants', NumberType::class, [
'block_prefix' => 'nb_participants',
'mapped' => false,
'attr' => [
'min' => 4,
'max' => 16,
'class' => 'nbParticipants',
'info_privatisation' => "form.reservation.nbParticipants.privatisation",
],
'data' => 6
])
->add('offer', ChoiceType::class, [
'block_prefix' => 'duration',
'choices' => [
$this->translator->trans('2 heures') => '120',
$this->translator->trans('3 heures') => '180',
],
'choice_attr' => [
$this->translator->trans('2 heures') => [
'duration' => $this->translator->trans('2 heures'),
'summary_label' => $this->translator->trans('Privatisation de 2 heures'),
],
$this->translator->trans('3 heures') => [
'duration' => $this->translator->trans('3 heures'),
'summary_label' => $this->translator->trans('Privatisation de 3 heures'),
],
],
'expanded' => true,
'multiple' => false,
'data' => '120'
])
->add('extraReservations', ExtraReservationCollectionType::class, [
'entry_type' => ExtraReservationType::class,
'allow_add' => true,
'allow_delete' => true,
'allow_extra_fields' => true,
'by_reference' => false,
'required' => false,
'prototype' => true,
'entry_options' => ['reservation' => $options['data']],
])
->add('date', DateTimeType::class, [
'date_widget' => 'single_text',
'time_widget' => 'single_text',
'block_prefix' => 'reservation_date',
'input' => 'datetime_immutable',
'required' => true,
])
->add('contactData', null, [
'mapped' => false,
'label' => false,
'data_class' => null,
'compound' => true,
])
->add('clientCommentary', TextareaType::class, [
'attr' => [
'placeholder' => $this->translator->trans('form.privatisation.commentary_placeholder'),
],
'required' => false,
])
->add('checkedCGV', CheckboxType::class, [
'label' => $this->translator->trans('form.privatisation.cgv_label'),
'required' => true,
'mapped' => true,
])
->add('checkedAcceptPromotion', CheckboxType::class, [
'label' => $this->translator->trans('form.privatisation.promotion_label'),
'mapped' => false,
'required' => false,
])
;
// Add contact fields as sub-fields of contactData
$builder->get('contactData')
->add('company', TextType::class, [
'attr' => [
'placeholder' => $this->translator->trans('form.privatisation.company_placeholder'),
],
'required' => false,
])
->add('firstname', TextType::class, [
'attr' => [
'placeholder' => $this->translator->trans('form.privatisation.firstname_placeholder'),
],
'required' => true,
])
->add('lastname', TextType::class, [
'attr' => [
'placeholder' => $this->translator->trans('form.privatisation.lastname_placeholder'),
],
'required' => true,
])
->add('email', EmailType::class, [
'attr' => [
'placeholder' => $this->translator->trans('Email'),
],
'required' => true,
])
->add('phoneNumber', TextType::class, [
'attr' => [
'placeholder' => $this->translator->trans('Téléphone'),
],
'required' => false,
])
->add('address', TextType::class, [
'attr' => [
'class' => 'pl-2 py-2 border border-black border-t-0 border-e-0',
'placeholder' => $this->translator->trans('Rue') . " *",
'autocomplete' => 'street-address',
],
'required' => true,
])
->add('city', TextType::class, [
'attr' => [
'class' => 'pl-2 py-2 border border-black border-t-0',
'placeholder' => $this->translator->trans('Ville') . " *",
'autocomplete' => 'address-level2',
],
'required' => true,
])
->add('postalCode', TextType::class, [
'attr' => [
'class' => 'pl-2 py-2 border border-black border-t-0 border-e-0',
'placeholder' => $this->translator->trans('Code Postal') . " *",
'autocomplete' => 'postal-code',
],
'required' => true,
])
->add('country', ChoiceType::class, [
'choices' => [
'France' => 'FR',
'Canada' => 'CA',
'Afghanistan' => 'AF',
'Afrique du sud' => 'ZA',
'Åland, îles' => 'AX',
'Albanie' => 'AL',
'Algérie' => 'DZ',
'Allemagne' => 'DE',
'Andorre' => 'AD',
'Angola' => 'AO',
'Anguilla' => 'AI',
'Antarctique' => 'AQ',
'Antigua et barbuda' => 'AG',
'Arabie saoudite' => 'SA',
'Argentine' => 'AR',
'Arménie' => 'AM',
'Aruba' => 'AW',
'Australie' => 'AU',
'Autriche' => 'AT',
'Azerbaïdjan' => 'AZ',
'Bahamas' => 'BS',
'Bahreïn' => 'BH',
'Bangladesh' => 'BD',
'Barbade' => 'BB',
'Bélarus' => 'BY',
'Belgique' => 'BE',
'Belize' => 'BZ',
'Bénin' => 'BJ',
'Bermudes' => 'BM',
'Bhoutan' => 'BT',
'Bolivie, l\'état plurinational de' => 'BO',
'Bonaire, saint eustache et saba' => 'BQ',
'Bosnie herzégovine' => 'BA',
'Botswana' => 'BW',
'Bouvet, île' => 'BV',
'Brésil' => 'BR',
'Brunei darussalam' => 'BN',
'Bulgarie' => 'BG',
'Burkina faso' => 'BF',
'Burundi' => 'BI',
'Caïmans, îles' => 'KY',
'Cambodge' => 'KH',
'Cameroun' => 'CM',
'Cap vert' => 'CV',
'Centrafricaine, république' => 'CF',
'Chili' => 'CL',
'Chine' => 'CN',
'Christmas, île' => 'CX',
'Chypre' => 'CY',
'Cocos (keeling), îles' => 'CC',
'Colombie' => 'CO',
'Comores' => 'KM',
'Congo' => 'CG',
'Congo, la république démocratique du' => 'CD',
'Cook, îles' => 'CK',
'Corée, république de' => 'KR',
'Corée, république populaire démocratique de' => 'KP',
'Costa rica' => 'CR',
'Côte d\'ivoire' => 'CI',
'Croatie' => 'HR',
'Cuba' => 'CU',
'Curaçao' => 'CW',
'Danemark' => 'DK',
'Djibouti' => 'DJ',
'Dominicaine, république' => 'DO',
'Dominique' => 'DM',
'Égypte' => 'EG',
'El salvador' => 'SV',
'Émirats arabes unis' => 'AE',
'Équateur' => 'EC',
'Érythrée' => 'ER',
'Espagne' => 'ES',
'Estonie' => 'EE',
'États unis' => 'US',
'Éthiopie' => 'ET',
'Falkland, îles (malvinas)' => 'FK',
'Féroé, îles' => 'FO',
'Fidji' => 'FJ',
'Finlande' => 'FI',
'Gabon' => 'GA',
'Gambie' => 'GM',
'Géorgie' => 'GE',
'Géorgie du sud et les îles sandwich du sud' => 'GS',
'Ghana' => 'GH',
'Gibraltar' => 'GI',
'Grèce' => 'GR',
'Grenade' => 'GD',
'Groenland' => 'GL',
'Guadeloupe' => 'GP',
'Guam' => 'GU',
'Guatemala' => 'GT',
'Guernesey' => 'GG',
'Guinée' => 'GN',
'Guinée bissau' => 'GW',
'Guinée équatoriale' => 'GQ',
'Guyana' => 'GY',
'Guyane française' => 'GF',
'Haïti' => 'HT',
'Heard et îles macdonald, île' => 'HM',
'Honduras' => 'HN',
'Hong kong' => 'HK',
'Hongrie' => 'HU',
'Île de man' => 'IM',
'Îles mineures éloignées des états unis' => 'UM',
'Îles vierges britanniques' => 'VG',
'Îles vierges des états unis' => 'VI',
'Inde' => 'IN',
'Indonésie' => 'ID',
'Iran, république islamique d\'' => 'IR',
'Iraq' => 'IQ',
'Irlande' => 'IE',
'Islande' => 'IS',
'Israël' => 'IL',
'Italie' => 'IT',
'Jamaïque' => 'JM',
'Japon' => 'JP',
'Jersey' => 'JE',
'Jordanie' => 'JO',
'Kazakhstan' => 'KZ',
'Kenya' => 'KE',
'Kirghizistan' => 'KG',
'Kiribati' => 'KI',
'Koweït' => 'KW',
'Lao, république démocratique populaire' => 'LA',
'Lesotho' => 'LS',
'Lettonie' => 'LV',
'Liban' => 'LB',
'Libéria' => 'LR',
'Libye' => 'LY',
'Liechtenstein' => 'LI',
'Lituanie' => 'LT',
'Luxembourg' => 'LU',
'Macao' => 'MO',
'Macédoine, l\'ex république yougoslave de' => 'MK',
'Madagascar' => 'MG',
'Malaisie' => 'MY',
'Malawi' => 'MW',
'Maldives' => 'MV',
'Mali' => 'ML',
'Malte' => 'MT',
'Mariannes du nord, îles' => 'MP',
'Maroc' => 'MA',
'Marshall, îles' => 'MH',
'Martinique' => 'MQ',
'Maurice' => 'MU',
'Mauritanie' => 'MR',
'Mayotte' => 'YT',
'Mexique' => 'MX',
'Micronésie, états fédérés de' => 'FM',
'Moldova, république de' => 'MD',
'Monaco' => 'MC',
'Mongolie' => 'MN',
'Monténégro' => 'ME',
'Montserrat' => 'MS',
'Mozambique' => 'MZ',
'Myanmar' => 'MM',
'Namibie' => 'NA',
'Nauru' => 'NR',
'Népal' => 'NP',
'Nicaragua' => 'NI',
'Niger' => 'NE',
'Nigéria' => 'NG',
'Niué' => 'NU',
'Norfolk, île' => 'NF',
'Norvège' => 'NO',
'Nouvelle calédonie' => 'NC',
'Nouvelle zélande' => 'NZ',
'Océan indien, territoire britannique de l\'' => 'IO',
'Oman' => 'OM',
'Ouganda' => 'UG',
'Ouzbékistan' => 'UZ',
'Pakistan' => 'PK',
'Palaos' => 'PW',
'Palestinien occupé, territoire' => 'PS',
'Panama' => 'PA',
'Papouasie nouvelle guinée' => 'PG',
'Paraguay' => 'PY',
'Pays bas' => 'NL',
'Pérou' => 'PE',
'Philippines' => 'PH',
'Pitcairn' => 'PN',
'Pologne' => 'PL',
'Polynésie française' => 'PF',
'Porto rico' => 'PR',
'Portugal' => 'PT',
'Qatar' => 'QA',
'Réunion' => 'RE',
'Roumanie' => 'RO',
'Royaume uni' => 'GB',
'Russie, fédération de' => 'RU',
'Rwanda' => 'RW',
'Sahara occidental' => 'EH',
'Saint barthélemy' => 'BL',
'Sainte hélène, ascension et tristan da cunha' => 'SH',
'Sainte lucie' => 'LC',
'Saint kitts et nevis' => 'KN',
'Saint marin' => 'SM',
'Saint martin(partie française)' => 'MF',
'Saint martin (partie néerlandaise)' => 'SX',
'Saint pierre et miquelon' => 'PM',
'Saint siège (état de la cité du vatican)' => 'VA',
'Saint vincent et les grenadines' => 'VC',
'Salomon, îles' => 'SB',
'Samoa' => 'WS',
'Samoa américaines' => 'AS',
'Sao tomé et principe' => 'ST',
'Sénégal' => 'SN',
'Serbie' => 'RS',
'Seychelles' => 'SC',
'Sierra leone' => 'SL',
'Singapour' => 'SG',
'Slovaquie' => 'SK',
'Slovénie' => 'SI',
'Somalie' => 'SO',
'Soudan' => 'SD',
'Soudan du sud' => 'SS',
'Sri lanka' => 'LK',
'Suède' => 'SE',
'Suisse' => 'CH',
'Suriname' => 'SR',
'Svalbard et île jan mayen' => 'SJ',
'Swaziland' => 'SZ',
'Syrienne, république arabe' => 'SY',
'Tadjikistan' => 'TJ',
'Taïwan, province de chine' => 'TW',
'Tanzanie, république unie de' => 'TZ',
'Tchad' => 'TD',
'Tchèque, république' => 'CZ',
'Terres australes françaises' => 'TF',
'Thaïlande' => 'TH',
'Timor leste' => 'TL',
'Togo' => 'TG',
'Tokelau' => 'TK',
'Tonga' => 'TO',
'Trinité et tobago' => 'TT',
'Tunisie' => 'TN',
'Turkménistan' => 'TM',
'Turks et caïcos, îles' => 'TC',
'Turquie' => 'TR',
'Tuvalu' => 'TV',
'Ukraine' => 'UA',
'Uruguay' => 'UY',
'Vanuatu' => 'VU',
'Venezuela, république bolivarienne du' => 'VE',
'Viet nam' => 'VN',
'Wallis et futuna' => 'WF',
'Yémen' => 'YE',
'Zambie' => 'ZM',
'Zimbabwe' => 'ZW',
],
'attr' => [
'class' => 'pl-2 py-2 border border-black border-t-0',
],
'required' => true,
'data' => 'FR',
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Privatisation::class,
'constraints' => [
new Callback([$this, 'validateExtraReservations'])
]
]);
}
public function validateExtraReservations($data, ExecutionContextInterface $context)
{
/** @var Privatisation $privatisation */
$privatisation = $data;
foreach ($privatisation->getExtraReservations() as $extraReservation) {
if ($extraReservation->isEmpty()) {
$privatisation->removeExtraReservation($extraReservation);
}
}
}
}