src/Form/RDVType.php line 329

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\PromoCode;
  4. use App\Entity\RDV;
  5. use App\Entity\Salon;
  6. use App\Entity\Client;
  7. use App\Entity\Product;
  8. use App\Entity\Intervenant;
  9. use App\Entity\CancelReason;
  10. use Doctrine\ORM\EntityRepository;
  11. use Symfony\Component\Form\AbstractType;
  12. use Symfony\Component\Form\FormBuilderInterface;
  13. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  14. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  15. use Symfony\Component\OptionsResolver\OptionsResolver;
  16. use Symfony\Component\Form\Extension\Core\Type\TextType;
  17. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  18. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  19. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  20. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  21. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  22. use Symfony\Component\Security\Core\Security;
  23. class RDVType extends AbstractType
  24. {
  25.     private $security;
  26.     public function __construct(Security $security)
  27.     {
  28.         $this->security $security;
  29.     }
  30.     /**
  31.      * @param FormBuilderInterface $builder
  32.      * @param array $options
  33.      * @return void
  34.      */
  35.     public function buildForm(FormBuilderInterface $builder, array $options)
  36.     {
  37.         $intervenant =
  38.             [
  39.                 'label' => 'Choisir un intervenant',
  40.                 'class' => Intervenant::class,
  41.                 'empty_data' => '',
  42.                 'attr' => [
  43.                     'placeholder' => 'Choisir un intervenant',
  44.                 ],
  45.                 'placeholder' => 'Choisir un intervenant',
  46.                 'label_attr' => array('class' => ''),
  47.                 'required' => false
  48.             ];
  49.         if (!$options['edition']) {
  50.             $intervenant['query_builder'] = function (EntityRepository $repository) {
  51.                 $qb $repository->createQueryBuilder('i');
  52.                 // the function returns a QueryBuilder object
  53.                 return $qb
  54.                     // find all users where 'deleted' is NOT '1'
  55.                     ->where($qb->expr()->eq('i.status''?1'))
  56.                     ->setParameter('1''1')
  57.                     ->orderBy('i.lastname''ASC');
  58.             };
  59.         }
  60.         $builder
  61.             ->add('intervenant'EntityType::class, $intervenant);
  62.         $array = [
  63.             'label' => 'Choisir un produit',
  64.             'class' => Product::class,
  65.             'query_builder' => function (EntityRepository $er) {
  66.                 // the function returns a QueryBuilder object
  67.                 return $er->createQueryBuilder('p')
  68.                     ->where('p.indisponibleVente = :indisponibleVente')
  69.                     ->setParameter('indisponibleVente'0);
  70.             },
  71.             'placeholder' => 'Choisir un produit',
  72.             'multiple' => true,
  73.             'mapped' => false,
  74.             'attr' => [
  75.                 'placeholder' => 'Choisir un produit',
  76.                 'style' => 'width:100%'
  77.             ],
  78.             'label_attr' => array('class' => ''),
  79.             'choice_label' => 'name'
  80.         ];
  81.         if (isset($options['salon'])) {
  82.             /** @var Salon $salon */
  83.             $salon $options['salon'];
  84.             $array array_merge($array, [
  85.                 'query_builder' => function (EntityRepository $er) use ($salon) {
  86.                     return $er->createQueryBuilder('p')
  87.                         ->where('p.type = :type')
  88.                         ->andWhere('p.indisponibleVente = :indisponibleVente')
  89.                         ->setParameter('indisponibleVente'0)
  90.                         ->setParameter('type'$salon->getService());
  91.                 },
  92.             ]);
  93.         }
  94.         if (!isset($options['view'])) {
  95.             $builder->add('products'EntityType::class, $array);
  96.         }
  97.         $builder->add('salon'EntityType::class, [
  98.             'label' => 'Salon',
  99.             'class' => Salon::class,
  100.             'attr' => [
  101.                 'placeholder' => 'Salon',
  102.             ],
  103.             'placeholder' => 'Salon',
  104.             'label_attr' => array('class' => ''),
  105.         ]);
  106.         $builder->add('comment'TextareaType::class, [
  107.             'label' => 'Remarques sur RDV',
  108.             'required' => false
  109.         ]);
  110.         $builder->add('codePromo'EntityType::class, [
  111.             'label' => 'Code promo',
  112.             'class' => PromoCode::class,
  113.             'required' => false,
  114.             'attr' => [
  115.                 'readonly' => !$options['canValidate'],
  116.             ],
  117.         ]);
  118.         $builder->add('infoCheque'TextType::class, [
  119.             'label' => 'Infos chèque',
  120.             'required' => false
  121.         ]);
  122.         $builder->add('chequeReception'CheckboxType::class, [
  123.             'label'    => 'Chèque réceptionné?',
  124.             'required' => false,
  125.         ]);
  126.         $builder->add('consignesClient'TextareaType::class, [
  127.             'label' => 'Consignes client',
  128.             'required' => false,
  129.             'mapped' => false,
  130.         ]);
  131.         $builder->add('roomNumber'TextType::class, [
  132.             'label' => 'Batiment / Étage / Numéro de chambre',
  133.             'attr' => [
  134.                 'placeholder' => 'Entrer le batiment / étage / numéro de chambre',
  135.             ],
  136.             'required' => false,
  137.             'mapped' => false,
  138.         ]);
  139.         $builder->add('client'EntityType::class, [
  140.             'label' => 'Choisir un client',
  141.             'placeholder' => 'Choisir un client',
  142.             'choice_label' => function (Client $client) {
  143.                 $site $client->getSite();
  144.                 $zipcode '';
  145.                 if ($site) {
  146.                     $zipcode $site->getAddress() ? $site->getAddress()->getZipcode() : '';
  147.                 }
  148.                 return $client->getLastname() . ' ' $client->getFirstname() . ' ' $zipcode;
  149.             },
  150.             'class' => Client::class,
  151.             'attr' => [
  152.                 'placeholder' => 'Choisir un client',
  153.             ],
  154.             'label_attr' => array('class' => ''),
  155.             'query_builder' => function (EntityRepository $er) {
  156.                 return $er->createQueryBuilder('c')
  157.                     ->where('(c.statusProspect != :status AND c.statusProspect != :statusParti) OR c.statusProspect IS NULL' )
  158.                     ->setParameter('status',  Client::STATUS_INACTIF)
  159.                     ->setParameter('statusParti',  'Parti');
  160.             },
  161.         ]);
  162.         $builder->add('start'DateTimeType::class, [
  163.             'widget' => 'single_text',
  164.             'required' => true,
  165.             // prevents rendering it as type="date", to avoid HTML5 date pickers
  166.             'html5' => false,
  167.             'label' => 'Début prestation',
  168.             'disabled' => $options['disabled'] ? true false,
  169.         ]);
  170.         $builder->add('hasAddService'ChoiceType::class, [
  171.             'label' => "Si votre parent souhaite un service additionnel à l’ehpad peut-il le commander ?",
  172.             'choices' => [
  173.                 'Ne sait pas' => 'Ne sait pas',
  174.                 'Oui' => 'Oui',
  175.                 'Non' => 'Non',
  176.             ],
  177.             'required' => true,
  178.         ]);
  179.         if ($options['withCustomPicker']) {
  180.             $builder->remove('start');
  181.             $builder->remove('intervenant');
  182.         }
  183.         if ($options['view'] === 'client') {
  184.             $builder->remove('start');
  185.             $builder->remove('intervenant');
  186.             $builder->remove('salon');
  187.             $builder->remove('client');
  188.             $builder->add('recurrence'ChoiceType::class, [
  189.                 'label' => 'Récurrence souhaitée',
  190.                 'choices' => [
  191.                     'Hebdomadaire' => 'hebdo',
  192.                     'Tous les 15 jours' => 'bi mensuelle',
  193.                     'Tous les mois' => 'mensuelle',
  194.                     'Tous les 2 mois' => 'bimestriel',
  195.                     'Trimestrielle' => 'trimestrielle',
  196.                     'Non, demande ponctuelle' => 'ponctuel',
  197.                 ],
  198.                 'placeholder' => 'Sélectionner',
  199.                 'required' => false,
  200.             ]);
  201.             $builder->add('email'EmailType::class, [
  202.                 'label' => "L’adresse mail de facturation",
  203.                 'mapped' => false,
  204.                 'attr' => [
  205.                     'placeholder' => 'L’adresse mail de facturation',
  206.                 ],
  207.                 'required' => true,
  208.             ]);
  209.             $builder->add('civilite'ChoiceType::class, [
  210.                 'label' => 'Civilité bénéficiaire de la prestation',
  211.                 'mapped' => false,
  212.                 'attr' => [
  213.                     'placeholder' => 'Civilité bénéficiaire de la prestation',
  214.                 ],
  215.                 'required' => true,
  216.                 'placeholder' => 'Choisir une civilite',
  217.                 'choices'  => [
  218.                     'Madame' => 'Madame',
  219.                     'Monsieur' => 'Monsieur',
  220.                 ],
  221.             ]);
  222.             $builder->add('lastname'null, [
  223.                 'label' => "Nom bénéficiaire de la prestation",
  224.                 'mapped' => false,
  225.                 'attr' => [
  226.                     'placeholder' => 'Nom bénéficiaire de la prestation',
  227.                 ],
  228.                 'required' => true,
  229.             ]);
  230.             $builder->add('firstname'null, [
  231.                 'label' => "Prénom bénéficiaire de la prestation",
  232.                 'mapped' => false,
  233.                 'attr' => [
  234.                     'placeholder' => 'Prénom bénéficiaire de la prestation',
  235.                 ],
  236.                 'required' => true,
  237.             ]);
  238.         }
  239.         if (isset($options['edition']) && $options['edition'] === true) {
  240.             $builder->add('start'DateTimeType::class, [
  241.                 'widget' => 'single_text',
  242.                 // prevents rendering it as type="date", to avoid HTML5 date pickers
  243.                 'html5' => false,
  244.                 'label' => 'Début prestation',
  245.                 'disabled' => $options['disabled'] ? true false,
  246.             ]);
  247.             $builder->add('end'DateTimeType::class, [
  248.                 'widget' => 'single_text',
  249.                 'html5' => false,
  250.                 'label' => 'Fin prestation',
  251.             ]);
  252.             $builder->add('priorite'ChoiceType::class, [
  253.                 'label' => 'Priorité',
  254.                 'choices' => [
  255.                     '1' => 1,
  256.                     '2' => 2,
  257.                     '3' => 3
  258.                 ]
  259.             ]);
  260.             $canValidate $options['canValidate'];
  261.             $choices = [
  262.                 'Planifié' => RDV::STATUS_PLANIFIER,
  263.                 'Annulé' => RDV::STATUS_ANNULER,
  264.                 'Validé' => RDV::STATUS_VALIDATED,
  265.                 //'Replanifié' => RDV::STATUS_REPLANIFIER,
  266.                 'Facturé' => RDV::STATUS_FACTURER,
  267.                 //'Reporté' => RDV::STATUS_REPORTE,
  268.                 // 'Facture annulé' => RDV::STATUS_FACTURE_ANNULER,
  269.             ];
  270.             /*if ($options['hideFacture']) {
  271.                 unset($choices['Facturé']);
  272.             }*/
  273.             $optionsStatus = [
  274.                 'label' => 'Statut',
  275.                 'choices' => $choices
  276.             ];
  277.             if ($canValidate === false) {
  278.                 $optionsStatus = [
  279.                     'label' => 'Statut',
  280.                     'choices' => $choices,
  281.                     'choice_attr' => function ($choice$key$value) {
  282.                         if ($value === 'billing') {
  283.                             return ['disabled' => 'disabled'];
  284.                         }
  285.                         return [];
  286.                     },
  287.                 ];
  288.             }
  289.             if($options['canChangeStatus'] === false){
  290.                 $optionsStatus = [
  291.                     'label' => 'Statut',
  292.                     'choices' => $choices,
  293.                     'choice_attr' => function ($choice$key$value) {
  294.                             return ['disabled' => 'disabled'];
  295.                     },
  296.                 ];
  297.             }
  298.             $builder->add('status'ChoiceType::class, $optionsStatus);
  299.             $builder->add('author'TextType::class, [
  300.                 'label' => 'Prise de RDV par',
  301.                 'disabled' => true,
  302.                 'attr' => [
  303.                     'placeholder' => $options['createdFrom'],
  304.                 ],
  305.             ]);
  306.             //                $builder ->add('validate', CheckboxType::class, [
  307.             //                    'label' => 'RDV Valider',
  308.             //                    'mapped' => false,
  309.             //                    'required' => false
  310.             //                ]);
  311.             $builder->add('comment'TextareaType::class, [
  312.                 'label' => 'Remarques sur RDV',
  313.                 'required' => false
  314.             ]);
  315.             $builder->add('commentForfait'TextareaType::class, [
  316.                 'label' => 'Remarques forfait',
  317.                 'required' => false,
  318.                 'label_attr' => [
  319.                     'style' => 'display:none',
  320.                 ],
  321.                 'attr' => [
  322.                     'style' => 'display:none',
  323.                 ],
  324.             ]);
  325.             $builder->add('cancelReason'EntityType::class, [
  326.                 'label' => 'Choisir un motif d\'annulation',
  327.                 'class' => CancelReason::class,
  328.                 'placeholder' => 'Choisir un motif d\'annulation',
  329.                 'required' => false,
  330.                 'attr' => [
  331.                     'placeholder' => 'Choisir un motif d\'annulation',
  332.                 ],
  333.                 'label_attr' => array('class' => ''),
  334.             ]);
  335.             $builder->add('recurrence'null, [
  336.                 'label' => 'Récurrence saisie par le client (espace réservation)',
  337.                 'disabled' => true,
  338.             ]);
  339.         } else {
  340.             //                $builder->add('start',HiddenType::class, [
  341.             //                ]);
  342.             $builder->add('end'HiddenType::class, []);
  343.             $builder->add('priorite'HiddenType::class, []);
  344.             $builder->add('status'HiddenType::class, []);
  345.         };
  346.     }
  347.     public function configureOptions(OptionsResolver $resolver)
  348.     {
  349.         $resolver->setDefaults([
  350.             'data_class' => RDV::class,
  351.             'edition' => false,
  352.             'salon' => null,
  353.             'canValidate' => false,
  354.             'view' => null,
  355.             'famille' => null,
  356.             'productIds' => null,
  357.             'allow_extra_fields' => true,
  358.             'createdFrom' => null,
  359.             'hideFacture' => false,
  360.             'csrf_protection' => true,
  361.             'csrf_field_name' => '_token',
  362.             // important part; unique key
  363.             'csrf_token_id'   => 'form_intention',
  364.             'withCustomPicker' => false,
  365.             'canChangeStatus' => true
  366.         ]);
  367.     }
  368. }