<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Validator\Constraints\File;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Entity\User;
use App\Service\Subscription;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\ResetType;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
class UserType extends AbstractType
{
private $subscriptionService;
public function __construct(Subscription $subscriptionService)
{
$this->subscriptionService = $subscriptionService;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($options['data'] == NULL || $options['data']->getIsActive() === null) {
$checked = true;
} else {
$checked = $options['data']->getIsActive();
}
$isLicensed = false;
if ($options['data'] == NULL || $options['data']->getId() !== null) {
$subs = $options['data']->getSubscriptions();
foreach ($subs as $sub) {
if($sub->getOfferSnapshot()->getOffer()->getPeriodicity() === "infinity") {
$isLicensed = true;
}
}
}
if ($options['data'] == NULL || $options['data']->getId() === null) {
//$sendChecked = true;
$sendChecked = true;
} else {
$sendChecked = false;
}
$signatureRequired = false;
if (!isset($options['data'])) {
$signatureRequired = false;
}
$data = $options['data'];
if (!$data->getId()) {
$signatureRequired = false;
}
$isSubscribed = $this->subscriptionService->is_subscribed(false, $data);
$hasNoSignature = $data->getSignature() === null;
$signatureRequired = $isSubscribed && $hasNoSignature;
$builder
->add('lastname', TextType::class, [
'label' => 'Nom',
'required' => true,
'attr' => [
'placeholder' => "DUPONT",
'onkeyup' => "this.value = this.value.toUpperCase();",
"pattern" => "^[ a-zA-ZÀ-ÿ\-\u00f1\u00d1]*$",
"oninput" => "this.value = this.value.replace(/[^A-Za-zÀ-ÖØ-öø-ÿ- ]/g, '')"
]
])
->add('firstname', TextType::class, [
'label' => 'Prénom',
'required' => true,
'attr' => [
'placeholder' => "Charles",
'onkeyup' => "this.value = ucfirst(this.value);",
"pattern" => "^[ a-zA-ZÀ-ÿ\-\u00f1\u00d1]*$",
"oninput" => "this.value = this.value.replace(/[^A-Za-zÀ-ÖØ-öø-ÿ- ]/g, '')"
]
])
->add('telephone', TextType::class, [
'label' => 'Téléphone',
'required' => true,
'attr' => [
'placeholder' => "(+33) 0606060606",
"oninput" => "this.value = this.value.replace(/[A-Za-z]/g, '').slice(0, 10)",
"pattern" => "^((\+)33|0)[1-9](\d{2}){4}$",
"minlength" => "10",
"maxlength" => "10",
]
])
->add('naissance', DateType::class, [
'label' => 'Date de naissance',
'html5' => false,
'widget' => 'single_text',
"format" => 'dd/MM/yyyy',
'attr' => [
"oninput" => "this.value = this.value.replace(/[A-Za-z]/g, '')",
'class' => 'naissancePicker',
'placeholder' => 'dd/mm/yyyy',
'data-date-format' => 'dd/mm/yyyy',
'x-mask' => "99/99/9999",
'x-data' => '{}',
'onchange'=>"window.validateDate(this)"
],
'required' => true
])
->add('adeli', TextType::class, [
'label' => 'Numéro professionnel de santé selon votre pays d\'exercice (RPPS, INAMI...)',
'required' => true,
'attr' => [
'placeholder' => "123456789",
"oninput" => "this.value = this.value.replace(/[A-Za-z]/g, '')"
],
])
->add('adeli_certif', FileType::class, [
'label' => 'Identification',
'label_attr' => ["class" => "fw-bold form-control-label"],
'multiple' => false,
'mapped' => false,
'required' => $options['adeli_certif'] == null ? true : false,
])
->add('adresse', TextType::class, [
'label' => 'Adresse professionnelle',
'required' => true,
'attr' => [
'placeholder' => "39 allée du Profil Diet",
]
])
->add('complementAdresse', TextType::class, [
'label' => 'Complément d\'adresse',
'required' => false,
'attr' => [
'placeholder' => "Résidence de la santé",
]
])
->add('zip', TextType::class, [
'label' => 'Code postal',
'required' => true,
'attr' => [
'placeholder' => "99999",
'pattern' => "[0-9]{5,5}",
'maxlength' => "5",
'minlength' => "5",
"oninput" => "this.value = this.value.replace(/[A-Za-z]/g, '')",
]
])
->add('ville', TextType::class, [
'label' => 'Ville',
'required' => true,
'attr' => [
'placeholder' => "Ville",
"oninput" => "this.value = this.value.replace(/[^A-Za-zÀ-ÿ\s'-]/g, '')"
]
])
->add('country', TextType::class, [
'label' => 'Pays',
'required' => true,
'attr' => [
'value' => "France",
'placeholder' => "Pays",
"oninput" => "this.value = this.value.replace(/[^A-Za-z]/g, '')"
]
])
->add('statuts', ChoiceType::class, [
'label' => false,
'required' => false,
'choices' => [
'Entreprise individuelle (EI)' => "ei",
'Entreprise unipersonnelle à responsabilité limitée (EURL)' => "eurl",
'Société à responsabilité limitée (SARL)' => "sarl",
'Société anonyme (SA)' => "sa",
'Société par actions simplifiée (SAS)' => "sas",
'Société par actions simplifiée unipersonnelle (SASU)' => "sasu",
'Employé(e)' => "Employé(e)",
'Autre' => "autre"
],
'attr' => [
'class' => 'select2',
'required' => false,
]
])
->add('siret', TextType::class, [
'label' => 'SIRET',
'required' => false,
'attr' => [
'placeholder' => "90480694087920",
"oninput" => "this.value = this.value.replace(/[A-Za-z]/g, '')",
"pattern" => "[0-9]+",
"maxlength" => "14",
"minlength" => "14",
"class" => "siret"
]
])
->add('asso', ChoiceType::class, [
'label' => "Membre d'associations, réseaux",
'required' => false,
"multiple" => true,
'choices' => [
'' => "",
'ADL' => "ADL",
'AFA' => "AFA",
'AFDN' => "AFDN",
'GROS' => "GROS",
'ONCODIET' => "ONCODIET",
'REPPOP' => "REPPOP",
'Autre' => "Autre"
],
'attr' => [
'class' => 'select2'
]
])
->add('asso_autre', TextType::class, [
'required' => false,
'label' => 'Autre',
'attr' => [
'placeholder' => "Autre",
]
])
->add('diplome', ChoiceType::class, [
'label' => "Diplôme",
'required' => true,
'choices' => [
'' => '',
'BTS Diététique' => 'BTS Diététique',
'BUT Diététique et Nutrition' => 'BUT diététique et nutrition',
'Autre' => 'Autre'
],
'attr' => [
'class' => 'select2'
]
])
->add('diplome_copy', FileType::class, [
'label' => 'Copie Diplôme',
'multiple' => false,
'mapped' => false,
'label_attr' => ["class" => "fw-bold form-control-label"],
'required' => $options['diplome_copy'] == null ? true : false
])
->add('specialite', ChoiceType::class, [
'label' => 'Spécialités',
'required' => false,
'multiple' => true,
'attr' => [
'class' => 'select2'
],
'choices' => [
'' => '',
'Addictions' => 'Addictions',
'Alimentation en pleine conscience' => 'Alimentation en pleine conscience',
'Alimentation intuitive' => 'Alimentation intuitive',
'Allergies, intolérances' => 'Allergies, intolérances',
'Cancérologie' => 'Cancérologie',
'Cardiologie' => 'Cardiologie',
'Chirurgie bariatrique' => 'Chirurgie bariatrique',
'Dénutrition, malnutrition' => 'Dénutrition, malnutrition',
'Diabétologie' => 'Diabétologie',
'Diététique sportive' => 'Diététique sportive',
'Endométriose' => 'Endométriose',
'ETP' => 'ETP',
'FODMAP' => 'FODMAP',
'Gériatrie' => 'Gériatrie',
'Grossesse' => 'Grossesse',
'Maladie coeliaque' => 'Maladie coeliaque',
'Microbiote' => 'Microbiote',
'Micronutrition' => 'Micronutrition',
'Néphrologie' => 'Néphrologie',
'Pédiatrie' => 'Pédiatrie',
'Psychonutrition' => 'Psychonutrition',
'Sevrage tabagique' => 'Sevrage tabagique',
'Suivi post opératoire' => 'Suivi post opératoire',
'Surpoids/Obésité' => 'Surpoids/Obésité',
'TCA' => 'TCA',
'Troubles hormonaux' => 'Troubles hormonaux',
'Troubles digestifs' => 'Troubles digestifs',
'Végétarisme, végétalisme, végan' => 'Végétarisme, végétalisme, végan',
'Autre' => 'Autre',
],
])
->add('specialite_autre', TextType::class, [
'required' => false,
'label' => 'Autre',
'attr' => [
'placeholder' => "Autre",
]
])
->add('anneeDiplome', TextType::class, [
'label' => "Année",
'required' => true,
'attr' => [
'placeholder' => "2016",
'pattern' => "[0-9]+",
"minlength" => "4",
"maxlength" => "4",
"oninput" => "this.value = this.value.replace(/[A-Za-z]/g, '')"
]
])
->add('email', EmailType::class, [
'required' => true,
'label' => 'Adresse e-mail',
'attr' => [
'placeholder' => "exemple@societe.com",
'pattern' => '[^@]+@[^@]+\.[a-zA-Z]{2,6}'
]
])
->add('password', PasswordType::class, [
'required' => $options['password'],
'empty_data' => "",
'mapped' => false,
'label' => 'Mot de passe',
'attr' => [
'autocomplete' => $options['password'] ? '' : 'off',
]
])
->add('signature', FileType::class, [
'label' => 'Signature',
'multiple' => false,
'mapped' => false,
'required' => $signatureRequired
])
->add('isOptin', CheckboxType::class, [
'required' => false,
'label' => 'Recevoir les e-mails automatiques de la plateforme',
'label_attr' => ['class' => 'custom-control-label'],
'data' => $checked,
'attr' => ['class' => 'custom-control-input']])
->add('reset', ResetType::class)
->add('logo', FileType::class, [
'label' => 'Logo du cabinet',
'label_attr' => ["class" => "fw-bold form-control-label"],
'multiple' => false,
'mapped' => false,
'attr' => [
'accept' => 'image/*',
'required' => false
],
'required' => false
])
->add('office', TextType::class, [
'label' => 'Nom du cabinet',
'required' => false,
'attr' => [
]
])
->add('website', TextType::class, [
'label' => 'Site internet',
'required' => false,
'attr' => [
]
])
->add('priceNumber', TextType::class, [
'label' => 'Honoraires 1 (€)',
'required' => false,
'attr' => [
'placeholder' => "70",
"oninput" => "this.value = this.value.replace(/[A-Za-z]/g, '')",
]
])
->add('priceLetter', TextType::class, [
'label' => 'Honoraires 1 (lettres)',
'required' => false,
'attr' => [
'placeholder' => "soixante-dix",
"oninput" => "this.value = this.value.replace(/[^A-Za-zÀ-ÿ\s'-]/g, '')"
]
])
->add('priceNumber2', TextType::class, [
'label' => 'Honoraires 2 (€)',
'required' => false,
'attr' => [
'placeholder' => "50",
"oninput" => "this.value = this.value.replace(/[A-Za-z]/g, '')",
]
])
->add('priceLetter2', TextType::class, [
'label' => 'Honoraires 2 (lettres)',
'required' => false,
'attr' => [
'placeholder' => "cinquante",
"oninput" => "this.value = this.value.replace(/[^A-Za-zÀ-ÿ\s'-]/g, '')"
]
]);
if($options['is_register'] === false) {
$builder->add('isActive', CheckboxType::class, [
'required' => false,
'label' => 'Activer le compte de cet utilisateur ',
'label_attr' => ['class' => 'custom-control-label'],
'data' => $checked,
'attr' =>[
'class' => 'custom-control-input'
]])
->add('sendEmail', CheckboxType::class, [
"mapped" => false,
'required' => false,
'data' =>$sendChecked,
'label' => "Envoyer le lien de réinitialisation du mot de passe à cet utilisateur par e-mail",
'label_attr' => ['class' => 'custom-control-label'],
'attr' =>[
'class' => 'custom-control-input'
]])
->add('isLicensed', CheckboxType::class, [
"mapped" => false,
'required' => false,
'data' =>$isLicensed,
'label' => "Utilisateur licencié",
'label_attr' => ['class' => 'custom-control-label'],
'attr' =>[
'class' => 'custom-control-input'
]]);
}
if($options['admin'] === true) {
$builder->add('roles', ChoiceType::class, [
'label' => false,
'attr' => [
'class' => 'select2'
],
'choices' => [
'Admin' => 'ROLE_ADMIN',
// === MODIFICATION 2025-01-13 : Migration ROLE_CUSTOMER vers rôles spécialisés ===
'Praticien' => 'ROLE_PRATICIEN', // Changé de ROLE_CUSTOMER
'Coach' => 'ROLE_COACH', // Ajout du rôle Coach
// === FIN MODIFICATION ===
'Patient' => 'ROLE_PATIENT',
],
'multiple' => true,
'expanded' => false,
'required' => true
]);
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$user = $event->getData();
$form = $event->getForm();
// If no roles are set, default to ROLE_COACH
if (empty($user) || !$user->getRoles()) {
$user->setRoles(['ROLE_COACH']);
}
$event->setData($user);
});
}
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
'admin' => false,
'password' => false,
'adeli_certif' => null,
'signature' => null,
'diplome_copy' => null,
'logo' => null,
'is_register' => false,
]);
}
}