src/Form/ContactCreationSocieteType.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\ContactCreationSociete;
  4. use Symfony\Component\Form\AbstractType;
  5. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  6. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  7. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  8. use Symfony\Component\Form\Extension\Core\Type\DateType;
  9. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  10. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  11. use Symfony\Component\Form\Extension\Core\Type\NumberType;
  12. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  13. use Symfony\Component\Form\Extension\Core\Type\TextType;
  14. use Symfony\Component\Form\FormBuilderInterface;
  15. use Symfony\Component\OptionsResolver\OptionsResolver;
  16. use Vich\UploaderBundle\Form\Type\VichFileType;
  17. use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeImmutableToDateTimeTransformer;
  18. class ContactCreationSocieteType extends AbstractType
  19. {
  20.     public function buildForm(FormBuilderInterface $builder, array $options): void
  21.     {
  22.         $cabinet $options['cabinet'];
  23.         $builder
  24.             // Section Civil
  25.             ->add('firstname'TextType::class, [
  26.                 'label' => 'Prénom',
  27.                 'attr' => [
  28.                     'class' => 'required'
  29.                 ]
  30.             ])
  31.             ->add('name'TextType::class, [
  32.                 'label' => 'Nom',
  33.                 'attr' => [
  34.                     'class' => 'required'
  35.                 ]
  36.             ])
  37.             ->add('phone'TextType::class, [
  38.                 'label' => 'Téléphone',
  39.                 'attr' => [
  40.                     'class' => 'required'
  41.                 ]
  42.             ])
  43.             ->add('email'EmailType::class, [
  44.                 'label' => 'Mail',
  45.                 'attr' => [
  46.                     'class' => 'required'
  47.                 ]
  48.             ])
  49.             ->add('adress'TextType::class, [
  50.                 'label' => 'Adresse de facturation',
  51.                 'attr' => [
  52.                     'class' => 'required'
  53.                 ]
  54.             ])
  55.             // Section Business
  56.             ->add('businessStructure'ChoiceType::class, [
  57.                 'label' => 'Forme de société',
  58.                 'attr' => [
  59.                     'class' => 'required'
  60.                 ],
  61.                 'choices' => [
  62.                     'SARL' => 'SARL',
  63.                     'SAS' => 'SAS',
  64.                     'EURL' => 'EURL',
  65.                     'SASU' => 'SASU',
  66.                     'EI' => 'EI',
  67.                     'SNC' => 'SNC',
  68.                 ],
  69.                 'expanded' => false,
  70.                 'multiple' => false
  71.             ])
  72.             ->add('societyName'TextType::class, [
  73.                 'label' => 'Nom de la société',
  74.                 'attr' => [
  75.                     'class' => 'required'
  76.                 ]
  77.             ])
  78.             ->add('societyAddress'TextType::class, [
  79.                 'label' => 'Adresse du siège social',
  80.                 'attr' => [
  81.                     'class' => 'required'
  82.                 ]
  83.             ])
  84.             ->add('societyCity'TextType::class, [
  85.                 'label' => 'Ville',
  86.                 'attr' => [
  87.                     'class' => 'required'
  88.                 ]
  89.             ])
  90.             ->add('societyZipCode'TextType::class, [
  91.                 'label' => 'Code postal',
  92.                 'attr' => [
  93.                     'class' => 'required'
  94.                 ]
  95.             ])
  96.             ->add('activity'TextType::class, [
  97.                 'label' => 'Secteur d\'activité',
  98.                 'attr' => [
  99.                     'class' => 'required'
  100.                 ]
  101.             ])
  102.             ->add('startActivityAt'DateType::class, [
  103.                 'label' => 'Date de début d\'activité',
  104.                 'widget' => 'single_text',
  105.                 'html5' => false,
  106.                 'input' => 'datetime_immutable',
  107.                 'format' => 'dd/MM/yyyy',
  108.                 'attr' => [
  109.                     'class' => 'datepicker required',
  110.                     'placeholder' => 'JJ/MM/AAAA',
  111.                 ],
  112.             ])
  113.             ->add('fiscalYearEndAt'DateType::class, [
  114.                 'label' => 'Date de fin d\'exercice',
  115.                 'widget' => 'single_text',
  116.                 'html5' => false,
  117.                 'input' => 'datetime_immutable',
  118.                 'format' => 'dd/MM/yyyy',
  119.                 'data' => new \DateTimeImmutable('last day of December this year'),
  120.                 'attr' => [
  121.                     'class' => 'datepicker required',
  122.                     'placeholder' => 'JJ/MM/AAAA',
  123.                 ],
  124.             ])
  125.             ->add('taxRegime'ChoiceType::class, [
  126.                 'label' => 'Régime fiscal',
  127.                 'attr' => [
  128.                     'class' => 'required'
  129.                 ],
  130.                 'choices' => [
  131.                     'IR' => 'IR',
  132.                     'IS' => 'IS',
  133.                 ],
  134.                 'expanded' => false,
  135.                 'multiple' => false
  136.             ])
  137.             ->add('tva'ChoiceType::class, [
  138.                 'label' => 'TVA applicable ?',
  139.                 'attr' => [
  140.                     'class' => 'required'
  141.                 ],
  142.                 'choices' => [
  143.                     'Oui' => true,
  144.                     'Non' => false,
  145.                 ],
  146.                 'expanded' => true,
  147.                 'multiple' => false
  148.             ])
  149.             ->add('companyCapital'TextType::class, [
  150.                 'label' => 'Capital',
  151.                 'attr' => [
  152.                     'class' => 'required',
  153.                     'inputmode' => 'numeric'// Affiche un pavé numérique sur mobile
  154.                     'pattern' => '[0-9]*'// Bloque la saisie de lettres sur certains navigateurs
  155.                     'class' => 'formatted-number',
  156.                 ]
  157.             ])
  158.             // Section Chiffres
  159.             ->add('investmentAmount'TextType::class, [
  160.                 'label' => 'Montant d’investissement (€)',
  161.                 'required' => false,
  162.                 'attr' => [
  163.                     'inputmode' => 'numeric'// Affiche un pavé numérique sur mobile
  164.                     'pattern' => '[0-9]*'// Bloque la saisie de lettres sur certains navigateurs
  165.                     'class' => 'formatted-number',
  166.                 ],
  167.             ])
  168.             ->add('personalContribution'TextType::class, [
  169.                 'label' => 'Apport personnel (€)',
  170.                 'required' => false,
  171.                 'attr' => [
  172.                     'inputmode' => 'numeric'// Affiche un pavé numérique sur mobile
  173.                     'pattern' => '[0-9]*'// Bloque la saisie de lettres sur certains navigateurs
  174.                     'class' => 'formatted-number',
  175.                 ],
  176.             ])
  177.             ->add('loanRequested'TextType::class, [
  178.                 'label' => 'Durée du prêt sollicité en année (si connu)',
  179.                 'required' => false,
  180.                 'attr' => [
  181.                     'placeholder' => 'Ex: 3 ans',
  182.                 ]
  183.             ])
  184.             ->add('loanRateRequested'TextType::class, [
  185.                 'label' => 'Taux du prêt sollicité (si connu)',
  186.                 'required' => false,
  187.                 'attr' => [
  188.                     'inputmode' => 'numeric'// Affiche un pavé numérique sur mobile
  189.                     'pattern' => '[0-9]*'// Bloque la saisie de lettres sur certains navigateurs
  190.                     'class' => 'formatted-taux'
  191.                 ],
  192.             ])
  193.             ->add('ca_estimated'TextType::class, [
  194.                 'label' => 'Chiffre d\'affaire estimé par an (€ HT)',
  195.                 'attr' => [
  196.                     'class' => 'required',
  197.                     'inputmode' => 'numeric'// Affiche un pavé numérique sur mobile
  198.                     'pattern' => '[0-9]*',
  199.                     'class' => 'formatted-number',
  200.                 ]
  201.             ])
  202.             ->add('marginRate'TextType::class, [
  203.                 'label' => 'Taux de marge (%)',
  204.                 'required' => false,
  205.                 'attr' => [
  206.                     'inputmode' => 'numeric'// Affiche un pavé numérique sur mobile
  207.                     'pattern' => '[0-9]*'// Bloque la saisie de lettres sur certains navigateurs
  208.                     'class' => 'formatted-taux'
  209.                 ],
  210.             ])
  211.             // Section Charges (Tableau)
  212.             ->add('suppliesConsumable'ChoiceType::class, [
  213.                 'label' => false,
  214.                 'choices' => [
  215.                     'Emballages' => 'Emballages',
  216.                     'Électricité' => 'Électricité',
  217.                     'Eau' => 'Eau',
  218.                     'Carburant' => 'Carburant',
  219.                     'Combustibles' => 'Combustibles',
  220.                     'Petit équipement' => 'Petit équipement',
  221.                     'Produits d\'entretien' => 'Produits d\'entretien',
  222.                     'Vêtement de travail' => 'Vêtement de travail',
  223.                     'Fournitures administratives' => 'Fournitures administratives',
  224.                 ],
  225.                 'multiple' => true,  // Permet la sélection multiple
  226.                 'expanded' => true,  // Affiche sous forme de cases à cocher
  227.                 'required' => false,
  228.             ])
  229.             ->add('externalServices'ChoiceType::class, [
  230.                 'label' => false,
  231.                 'choices' => [
  232.                     'Sous-traitance' => 'Sous-traitance',
  233.                     'Location immobilière' => 'Location immobilière',
  234.                     'Location de matériels CAISSE' => 'Location de matériels CAISSE',
  235.                     'Location véhicule' => 'Location véhicule',
  236.                     'Alarme' => 'Alarme',
  237.                     'Entretien et réparations' => 'Entretien et réparations',
  238.                     'Primes d\'assurances' => 'Primes d\'assurances',
  239.                     'Études et recherches' => 'Études et recherches',
  240.                     'Documentation, séminaires' => 'Documentation, séminaires',
  241.                     'Personnel extérieur à l\'entreprise' => 'Personnel extérieur à l\'entreprise',
  242.                     'Rémunération d\'intermédiaires' => 'Rémunération d\'intermédiaires',
  243.                     'Honoraires comptables / juridiques' => 'Honoraires comptables / juridiques',
  244.                     'Honoraires techniques' => 'Honoraires techniques',
  245.                     'Publicité, publications' => 'Publicité, publications',
  246.                     'Foire expositions' => 'Foire expositions',
  247.                     'Transport sur achats' => 'Transport sur achats',
  248.                     'Transport sur ventes' => 'Transport sur ventes',
  249.                     'Déplacements' => 'Déplacements',
  250.                     'Missions, réceptions' => 'Missions, réceptions',
  251.                     'Frais postaux' => 'Frais postaux',
  252.                     'Frais télécommunications' => 'Frais télécommunications',
  253.                 ],
  254.                 'multiple' => true,
  255.                 'expanded' => true,
  256.                 'required' => false,
  257.             ])
  258.             ->add('contactCreationSocieteCharges'CollectionType::class, [
  259.                 'entry_type' => ContactCreationSocieteChargeType::class,
  260.                 'label' => false,
  261.                 'by_reference' => false,
  262.                 'allow_add' => true,
  263.                 'allow_delete' => true,
  264.                 'entry_options' => [
  265.                     'label' => false
  266.                 ]
  267.             ])
  268.             // Section Collaborateurs
  269.             ->add('employees'ChoiceType::class, [
  270.                 'label' => 'Avez-vous des salariés (dont apprentis) ?',
  271.                 'choices' => [
  272.                     'Oui' => true,
  273.                     'Non' => false,
  274.                 ],
  275.                 'expanded' => true,
  276.                 'multiple' => false,
  277.                 'required' => true,
  278.             ])
  279.             ->add('employeesNumber'TextType::class, [
  280.                 'label' => 'Nombre de salariés',
  281.                 'required' => false,
  282.                 'attr' => [
  283.                     'inputmode' => 'numeric'// Affiche un pavé numérique sur mobile
  284.                     'pattern' => '[0-9]*'// Bloque la saisie de lettres sur certains navigateurs
  285.                     'value' => 0,
  286.                 ],
  287.             ])
  288.             ->add('apprenticesNumber'TextType::class, [
  289.                 'label' => 'Nombre d\'apprentis',
  290.                 'required' => false,
  291.                 'attr' => [
  292.                     'inputmode' => 'numeric'// Affiche un pavé numérique sur mobile
  293.                     'pattern' => '[0-9]*'// Bloque la saisie de lettres sur certains navigateurs
  294.                     'value' => 0,
  295.                     'class' => 'formatted-number',
  296.                 ],
  297.             ])
  298.             ->add('contactCreationSocieteSalaryEmployees'CollectionType::class, [
  299.                 'entry_type' => ContactCreationSocieteSalaryEmployeeType::class,
  300.                 'label' => false,
  301.                 'by_reference' => false,
  302.                 'allow_add' => true,
  303.                 'allow_delete' => true,
  304.                 'entry_options' => [
  305.                     'label' => false,
  306.                 ],
  307.                 'prototype' => true// Ajout du prototype pour être utilisé en JS
  308.                 'prototype_name' => '__name__'// Nom de l'élément prototype
  309.             ])
  310.             ->add('netDirectorSalary'TextType::class, [
  311.                 'label' => 'Rémunération dirigeant mensuel net (€)',
  312.                 'required' => true,
  313.                 'attr' => [
  314.                     'inputmode' => 'numeric'// Affiche un pavé numérique sur mobile
  315.                     'pattern' => '[0-9]*'// Bloque la saisie de lettres sur certains navigateurs
  316.                     'class' => 'formatted-number',
  317.                 ],
  318.             ])
  319.             ->add('unemploymentRights'ChoiceType::class, [
  320.                 'label' => 'Droit chômage ?',
  321.                 'choices' => [
  322.                     'Oui' => true,
  323.                     'Non' => false,
  324.                 ],
  325.                 'expanded' => true,
  326.                 'multiple' => false
  327.             ])
  328.             // Champ libre
  329.             ->add('additionalInformations'TextareaType::class, [
  330.                 'label' => "Informations complémentaires",
  331.                 'required' => true,
  332.                 'attr' => [
  333.                     'class' => 'required'
  334.                 ]
  335.             ])
  336.             ->add('pdfFile'VichFileType::class, [
  337.                 'label' => 'Joindre un document (facultatif)',
  338.                 'required' => false,
  339.                 'allow_delete' => true,
  340.                 'download_uri' => false,
  341.                 'delete_label' => 'Supprimer le fichier',
  342.                 'attr' => [
  343.                     'class' => 'form-control js-file-input'
  344.                 ]
  345.             ])
  346.             ->add('category'HiddenType::class)
  347.             ->add('cgv'CheckboxType::class, [
  348.                 'label' => false,
  349.                 'required' => true,
  350.                 'mapped' => false,
  351.                 'attr' => [
  352.                     'class' => 'required'
  353.                 ]
  354.             ])
  355.             ->add('paymentMethod'HiddenType::class, [
  356.                 'data' => 'paypal'// Valeur par défaut
  357.             ]);
  358.     }
  359.     public function configureOptions(OptionsResolver $resolver): void
  360.     {
  361.         $resolver->setDefaults([
  362.             'data_class' => ContactCreationSociete::class,
  363.             'cabinet' => null
  364.         ]);
  365.     }
  366. }