src/Form/PrivatisationType.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Privatisation;
  4. use App\Entity\InterfaceReservation;
  5. use App\Form\ExtraReservationCollectionType;
  6. use Symfony\Component\Form\AbstractType;
  7. use Symfony\Component\Form\Extension\Core\Type\NumberType;
  8. use Symfony\Component\Form\FormBuilderInterface;
  9. use Symfony\Component\Validator\Constraints\Callback;
  10. use Symfony\Component\OptionsResolver\OptionsResolver;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  13. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  14. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  15. use Symfony\Component\Form\Extension\Core\Type\TextType;
  16. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  17. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  18. use Symfony\Component\Validator\Context\ExecutionContextInterface;
  19. class PrivatisationType extends AbstractType
  20. {
  21.     private $translator;
  22.     public function __construct(TranslatorInterface $translator)
  23.     {
  24.         $this->translator $translator;
  25.     }
  26.     
  27.     public function buildForm(FormBuilderInterface $builder, array $options): void
  28.     {
  29.         $builder
  30.             ->add('nbParticipants'NumberType::class, [
  31.                 'block_prefix' => 'nb_participants',
  32.                 'mapped' => false,
  33.                 'attr' => [
  34.                     'min' => 4,
  35.                     'max' => 16,
  36.                     'class' => 'nbParticipants',
  37.                     'info_privatisation' => "form.reservation.nbParticipants.privatisation",
  38.                 ],
  39.                 'data' => 6
  40.             ])
  41.             ->add('offer'ChoiceType::class, [
  42.                 'block_prefix' => 'duration',
  43.                 'choices' => [
  44.                     $this->translator->trans('2 heures') => '120',
  45.                     $this->translator->trans('3 heures') => '180',
  46.                 ],
  47.                 'choice_attr' => [
  48.                     $this->translator->trans('2 heures') => [
  49.                         'duration' => $this->translator->trans('2 heures'),
  50.                         'summary_label' => $this->translator->trans('Privatisation de 2 heures'),
  51.                     ],
  52.                     $this->translator->trans('3 heures') => [
  53.                         'duration' => $this->translator->trans('3 heures'),
  54.                         'summary_label' => $this->translator->trans('Privatisation de 3 heures'),
  55.                     ],
  56.                 ],
  57.                 'expanded' => true,
  58.                 'multiple' => false,
  59.                 'data' => '120'
  60.             ])
  61.             ->add('extraReservations'ExtraReservationCollectionType::class, [
  62.                 'entry_type' => ExtraReservationType::class,
  63.                 'allow_add' => true,
  64.                 'allow_delete' => true,
  65.                 'allow_extra_fields' => true,
  66.                 'by_reference' => false,
  67.                 'required' => false,
  68.                 'prototype' => true,
  69.                 'entry_options' => ['reservation' => $options['data']],
  70.             ])
  71.             ->add('date'DateTimeType::class, [
  72.                 'date_widget' => 'single_text',
  73.                 'time_widget' => 'single_text',
  74.                 'block_prefix' => 'reservation_date',
  75.                 'input' => 'datetime_immutable',
  76.                 'required' => true,
  77.             ])
  78.             ->add('contactData'null, [
  79.                 'mapped' => false,
  80.                 'label' => false,
  81.                 'data_class' => null,
  82.                 'compound' => true,
  83.             ])
  84.             ->add('clientCommentary'TextareaType::class, [
  85.                 'attr' => [
  86.                     'placeholder' => $this->translator->trans('form.privatisation.commentary_placeholder'),
  87.                 ],
  88.                 'required' => false,
  89.             ])
  90.             ->add('checkedCGV'CheckboxType::class, [
  91.                 'label' => $this->translator->trans('form.privatisation.cgv_label'),
  92.                 'required' => true,
  93.                 'mapped' => true,
  94.             ])
  95.             ->add('checkedAcceptPromotion'CheckboxType::class, [
  96.                 'label' => $this->translator->trans('form.privatisation.promotion_label'),
  97.                 'mapped' => false,
  98.                 'required' => false,
  99.             ])
  100.         ;
  101.         // Add contact fields as sub-fields of contactData
  102.         $builder->get('contactData')
  103.             ->add('company'TextType::class, [
  104.                 'attr' => [
  105.                     'placeholder' => $this->translator->trans('form.privatisation.company_placeholder'),
  106.                 ],
  107.                 'required' => false,
  108.             ])
  109.             ->add('firstname'TextType::class, [
  110.                 'attr' => [
  111.                     'placeholder' => $this->translator->trans('form.privatisation.firstname_placeholder'),
  112.                 ],
  113.                 'required' => true,
  114.             ])
  115.             ->add('lastname'TextType::class, [
  116.                 'attr' => [
  117.                     'placeholder' => $this->translator->trans('form.privatisation.lastname_placeholder'),
  118.                 ],
  119.                 'required' => true,
  120.             ])
  121.             ->add('email'EmailType::class, [
  122.                 'attr' => [
  123.                     'placeholder' => $this->translator->trans('Email'),
  124.                 ],
  125.                 'required' => true,
  126.             ])
  127.             ->add('phoneNumber'TextType::class, [
  128.                 'attr' => [
  129.                     'placeholder' => $this->translator->trans('Téléphone'),
  130.                 ],
  131.                 'required' => false,
  132.             ])
  133.             ->add('address'TextType::class, [
  134.                 'attr' => [
  135.                     'class' => 'pl-2 py-2 border border-black border-t-0 border-e-0',
  136.                     'placeholder' => $this->translator->trans('Rue') . " *",
  137.                     'autocomplete' => 'street-address',
  138.                 ],
  139.                 'required' => true,
  140.             ])
  141.             ->add('city'TextType::class, [
  142.                 'attr' => [
  143.                     'class' => 'pl-2 py-2 border border-black border-t-0',
  144.                     'placeholder' => $this->translator->trans('Ville') . " *",
  145.                     'autocomplete' => 'address-level2',
  146.                 ],
  147.                 'required' => true,
  148.             ])
  149.             ->add('postalCode'TextType::class, [
  150.                 'attr' => [
  151.                     'class' => 'pl-2 py-2 border border-black border-t-0 border-e-0',
  152.                     'placeholder' => $this->translator->trans('Code Postal') . " *",
  153.                     'autocomplete' => 'postal-code',
  154.                 ],
  155.                 'required' => true,
  156.             ])
  157.             ->add('country'ChoiceType::class, [
  158.                 'choices' => [
  159.                     'France' => 'FR',
  160.                     'Canada' => 'CA',
  161.                     'Afghanistan' => 'AF',
  162.                     'Afrique du sud' => 'ZA',
  163.                     'Åland, îles' => 'AX',
  164.                     'Albanie' => 'AL',
  165.                     'Algérie' => 'DZ',
  166.                     'Allemagne' => 'DE',
  167.                     'Andorre' => 'AD',
  168.                     'Angola' => 'AO',
  169.                     'Anguilla' => 'AI',
  170.                     'Antarctique' => 'AQ',
  171.                     'Antigua et barbuda' => 'AG',
  172.                     'Arabie saoudite' => 'SA',
  173.                     'Argentine' => 'AR',
  174.                     'Arménie' => 'AM',
  175.                     'Aruba' => 'AW',
  176.                     'Australie' => 'AU',
  177.                     'Autriche' => 'AT',
  178.                     'Azerbaïdjan' => 'AZ',
  179.                     'Bahamas' => 'BS',
  180.                     'Bahreïn' => 'BH',
  181.                     'Bangladesh' => 'BD',
  182.                     'Barbade' => 'BB',
  183.                     'Bélarus' => 'BY',
  184.                     'Belgique' => 'BE',
  185.                     'Belize' => 'BZ',
  186.                     'Bénin' => 'BJ',
  187.                     'Bermudes' => 'BM',
  188.                     'Bhoutan' => 'BT',
  189.                     'Bolivie, l\'état plurinational de' => 'BO',
  190.                     'Bonaire, saint eustache et saba' => 'BQ',
  191.                     'Bosnie herzégovine' => 'BA',
  192.                     'Botswana' => 'BW',
  193.                     'Bouvet, île' => 'BV',
  194.                     'Brésil' => 'BR',
  195.                     'Brunei darussalam' => 'BN',
  196.                     'Bulgarie' => 'BG',
  197.                     'Burkina faso' => 'BF',
  198.                     'Burundi' => 'BI',
  199.                     'Caïmans, îles' => 'KY',
  200.                     'Cambodge' => 'KH',
  201.                     'Cameroun' => 'CM',
  202.                     'Cap vert' => 'CV',
  203.                     'Centrafricaine, république' => 'CF',
  204.                     'Chili' => 'CL',
  205.                     'Chine' => 'CN',
  206.                     'Christmas, île' => 'CX',
  207.                     'Chypre' => 'CY',
  208.                     'Cocos (keeling), îles' => 'CC',
  209.                     'Colombie' => 'CO',
  210.                     'Comores' => 'KM',
  211.                     'Congo' => 'CG',
  212.                     'Congo, la république démocratique du' => 'CD',
  213.                     'Cook, îles' => 'CK',
  214.                     'Corée, république de' => 'KR',
  215.                     'Corée, république populaire démocratique de' => 'KP',
  216.                     'Costa rica' => 'CR',
  217.                     'Côte d\'ivoire' => 'CI',
  218.                     'Croatie' => 'HR',
  219.                     'Cuba' => 'CU',
  220.                     'Curaçao' => 'CW',
  221.                     'Danemark' => 'DK',
  222.                     'Djibouti' => 'DJ',
  223.                     'Dominicaine, république' => 'DO',
  224.                     'Dominique' => 'DM',
  225.                     'Égypte' => 'EG',
  226.                     'El salvador' => 'SV',
  227.                     'Émirats arabes unis' => 'AE',
  228.                     'Équateur' => 'EC',
  229.                     'Érythrée' => 'ER',
  230.                     'Espagne' => 'ES',
  231.                     'Estonie' => 'EE',
  232.                     'États unis' => 'US',
  233.                     'Éthiopie' => 'ET',
  234.                     'Falkland, îles (malvinas)' => 'FK',
  235.                     'Féroé, îles' => 'FO',
  236.                     'Fidji' => 'FJ',
  237.                     'Finlande' => 'FI',
  238.                     'Gabon' => 'GA',
  239.                     'Gambie' => 'GM',
  240.                     'Géorgie' => 'GE',
  241.                     'Géorgie du sud et les îles sandwich du sud' => 'GS',
  242.                     'Ghana' => 'GH',
  243.                     'Gibraltar' => 'GI',
  244.                     'Grèce' => 'GR',
  245.                     'Grenade' => 'GD',
  246.                     'Groenland' => 'GL',
  247.                     'Guadeloupe' => 'GP',
  248.                     'Guam' => 'GU',
  249.                     'Guatemala' => 'GT',
  250.                     'Guernesey' => 'GG',
  251.                     'Guinée' => 'GN',
  252.                     'Guinée bissau' => 'GW',
  253.                     'Guinée équatoriale' => 'GQ',
  254.                     'Guyana' => 'GY',
  255.                     'Guyane française' => 'GF',
  256.                     'Haïti' => 'HT',
  257.                     'Heard et îles macdonald, île' => 'HM',
  258.                     'Honduras' => 'HN',
  259.                     'Hong kong' => 'HK',
  260.                     'Hongrie' => 'HU',
  261.                     'Île de man' => 'IM',
  262.                     'Îles mineures éloignées des états unis' => 'UM',
  263.                     'Îles vierges britanniques' => 'VG',
  264.                     'Îles vierges des états unis' => 'VI',
  265.                     'Inde' => 'IN',
  266.                     'Indonésie' => 'ID',
  267.                     'Iran, république islamique d\'' => 'IR',
  268.                     'Iraq' => 'IQ',
  269.                     'Irlande' => 'IE',
  270.                     'Islande' => 'IS',
  271.                     'Israël' => 'IL',
  272.                     'Italie' => 'IT',
  273.                     'Jamaïque' => 'JM',
  274.                     'Japon' => 'JP',
  275.                     'Jersey' => 'JE',
  276.                     'Jordanie' => 'JO',
  277.                     'Kazakhstan' => 'KZ',
  278.                     'Kenya' => 'KE',
  279.                     'Kirghizistan' => 'KG',
  280.                     'Kiribati' => 'KI',
  281.                     'Koweït' => 'KW',
  282.                     'Lao, république démocratique populaire' => 'LA',
  283.                     'Lesotho' => 'LS',
  284.                     'Lettonie' => 'LV',
  285.                     'Liban' => 'LB',
  286.                     'Libéria' => 'LR',
  287.                     'Libye' => 'LY',
  288.                     'Liechtenstein' => 'LI',
  289.                     'Lituanie' => 'LT',
  290.                     'Luxembourg' => 'LU',
  291.                     'Macao' => 'MO',
  292.                     'Macédoine, l\'ex république yougoslave de' => 'MK',
  293.                     'Madagascar' => 'MG',
  294.                     'Malaisie' => 'MY',
  295.                     'Malawi' => 'MW',
  296.                     'Maldives' => 'MV',
  297.                     'Mali' => 'ML',
  298.                     'Malte' => 'MT',
  299.                     'Mariannes du nord, îles' => 'MP',
  300.                     'Maroc' => 'MA',
  301.                     'Marshall, îles' => 'MH',
  302.                     'Martinique' => 'MQ',
  303.                     'Maurice' => 'MU',
  304.                     'Mauritanie' => 'MR',
  305.                     'Mayotte' => 'YT',
  306.                     'Mexique' => 'MX',
  307.                     'Micronésie, états fédérés de' => 'FM',
  308.                     'Moldova, république de' => 'MD',
  309.                     'Monaco' => 'MC',
  310.                     'Mongolie' => 'MN',
  311.                     'Monténégro' => 'ME',
  312.                     'Montserrat' => 'MS',
  313.                     'Mozambique' => 'MZ',
  314.                     'Myanmar' => 'MM',
  315.                     'Namibie' => 'NA',
  316.                     'Nauru' => 'NR',
  317.                     'Népal' => 'NP',
  318.                     'Nicaragua' => 'NI',
  319.                     'Niger' => 'NE',
  320.                     'Nigéria' => 'NG',
  321.                     'Niué' => 'NU',
  322.                     'Norfolk, île' => 'NF',
  323.                     'Norvège' => 'NO',
  324.                     'Nouvelle calédonie' => 'NC',
  325.                     'Nouvelle zélande' => 'NZ',
  326.                     'Océan indien, territoire britannique de l\'' => 'IO',
  327.                     'Oman' => 'OM',
  328.                     'Ouganda' => 'UG',
  329.                     'Ouzbékistan' => 'UZ',
  330.                     'Pakistan' => 'PK',
  331.                     'Palaos' => 'PW',
  332.                     'Palestinien occupé, territoire' => 'PS',
  333.                     'Panama' => 'PA',
  334.                     'Papouasie nouvelle guinée' => 'PG',
  335.                     'Paraguay' => 'PY',
  336.                     'Pays bas' => 'NL',
  337.                     'Pérou' => 'PE',
  338.                     'Philippines' => 'PH',
  339.                     'Pitcairn' => 'PN',
  340.                     'Pologne' => 'PL',
  341.                     'Polynésie française' => 'PF',
  342.                     'Porto rico' => 'PR',
  343.                     'Portugal' => 'PT',
  344.                     'Qatar' => 'QA',
  345.                     'Réunion' => 'RE',
  346.                     'Roumanie' => 'RO',
  347.                     'Royaume uni' => 'GB',
  348.                     'Russie, fédération de' => 'RU',
  349.                     'Rwanda' => 'RW',
  350.                     'Sahara occidental' => 'EH',
  351.                     'Saint barthélemy' => 'BL',
  352.                     'Sainte hélène, ascension et tristan da cunha' => 'SH',
  353.                     'Sainte lucie' => 'LC',
  354.                     'Saint kitts et nevis' => 'KN',
  355.                     'Saint marin' => 'SM',
  356.                     'Saint martin(partie française)' => 'MF',
  357.                     'Saint martin (partie néerlandaise)' => 'SX',
  358.                     'Saint pierre et miquelon' => 'PM',
  359.                     'Saint siège (état de la cité du vatican)' => 'VA',
  360.                     'Saint vincent et les grenadines' => 'VC',
  361.                     'Salomon, îles' => 'SB',
  362.                     'Samoa' => 'WS',
  363.                     'Samoa américaines' => 'AS',
  364.                     'Sao tomé et principe' => 'ST',
  365.                     'Sénégal' => 'SN',
  366.                     'Serbie' => 'RS',
  367.                     'Seychelles' => 'SC',
  368.                     'Sierra leone' => 'SL',
  369.                     'Singapour' => 'SG',
  370.                     'Slovaquie' => 'SK',
  371.                     'Slovénie' => 'SI',
  372.                     'Somalie' => 'SO',
  373.                     'Soudan' => 'SD',
  374.                     'Soudan du sud' => 'SS',
  375.                     'Sri lanka' => 'LK',
  376.                     'Suède' => 'SE',
  377.                     'Suisse' => 'CH',
  378.                     'Suriname' => 'SR',
  379.                     'Svalbard et île jan mayen' => 'SJ',
  380.                     'Swaziland' => 'SZ',
  381.                     'Syrienne, république arabe' => 'SY',
  382.                     'Tadjikistan' => 'TJ',
  383.                     'Taïwan, province de chine' => 'TW',
  384.                     'Tanzanie, république unie de' => 'TZ',
  385.                     'Tchad' => 'TD',
  386.                     'Tchèque, république' => 'CZ',
  387.                     'Terres australes françaises' => 'TF',
  388.                     'Thaïlande' => 'TH',
  389.                     'Timor leste' => 'TL',
  390.                     'Togo' => 'TG',
  391.                     'Tokelau' => 'TK',
  392.                     'Tonga' => 'TO',
  393.                     'Trinité et tobago' => 'TT',
  394.                     'Tunisie' => 'TN',
  395.                     'Turkménistan' => 'TM',
  396.                     'Turks et caïcos, îles' => 'TC',
  397.                     'Turquie' => 'TR',
  398.                     'Tuvalu' => 'TV',
  399.                     'Ukraine' => 'UA',
  400.                     'Uruguay' => 'UY',
  401.                     'Vanuatu' => 'VU',
  402.                     'Venezuela, république bolivarienne du' => 'VE',
  403.                     'Viet nam' => 'VN',
  404.                     'Wallis et futuna' => 'WF',
  405.                     'Yémen' => 'YE',
  406.                     'Zambie' => 'ZM',
  407.                     'Zimbabwe' => 'ZW',
  408.                 ],
  409.                 'attr' => [
  410.                     'class' => 'pl-2 py-2 border border-black border-t-0',
  411.                 ],
  412.                 'required' => true,
  413.                 'data' => 'FR',
  414.             ])
  415.         ;
  416.     }
  417.     public function configureOptions(OptionsResolver $resolver): void
  418.     {
  419.         $resolver->setDefaults([
  420.             'data_class' => Privatisation::class,
  421.             'constraints' => [
  422.                 new Callback([$this'validateExtraReservations'])
  423.             ]
  424.         ]);
  425.     }
  426.     public function validateExtraReservations($dataExecutionContextInterface $context)
  427.     {
  428.         /** @var Privatisation $privatisation */
  429.         $privatisation $data;
  430.         foreach ($privatisation->getExtraReservations() as $extraReservation) {
  431.             if ($extraReservation->isEmpty()) {
  432.                 $privatisation->removeExtraReservation($extraReservation);
  433.             }
  434.         }
  435.     }
  436. }