<?php
declare(strict_types=1);
/**
* @author Mehrez Labidi
*/
namespace App\Form\Type\ProfilRepreneur;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\NotBlank;
use App\Form\Type\ProfilRepreneur\ProfilRepreneurType;
use App\Entity\ProfilRepreneur;
use App\Validator\Constraints\Montant;
use App\Helper\Utils;
use Symfony\Component\Form\Extension\Core\Type\{
ChoiceType,
DateType,
TextType,
HiddenType,
TextareaType,
NumberType,
SubmitType
};
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Form\Type\FormChoices;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
class RessourcesCapaciteType extends ProfilRepreneurType {
public function buildForm(FormBuilderInterface $builder, array $options): void {
parent::buildForm($builder, $options);
// ===== RESSOURCES FINANCIÈRES =====
$builder
->add('apport', NumberType::class, [
'label' => 'Quel est votre apport financier personnel pour ce projet de reprise',
'required' => false,
'invalid_message' => 'Ce montant est invalide',
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer votre apport financier personnel.',
'groups' => ['publier'],
]),
new Montant()
],
'attr' => ['placeholder' => 'en €', 'id' => 'apport']
])
->add('apport_liquide', ChoiceType::class, [
'label' => 'Cet apport financier est-il immédiatement et entièrement liquide pour votre projet de reprise ?',
'choices' => [
'Oui' => ProfilRepreneur::OUI,
'Non' => ProfilRepreneur::NON
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer si votre apport est immédiatement liquide.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'apport_liquide']
])
->add('precisions_apport_liquide', TextareaType::class, [
'label' => 'Précisez',
'required' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez préciser pourquoi votre apport n\'est pas entièrement liquide.',
'groups' => ['publier'],
]),
],
'attr' => [
'class' => 'form-control',
'rows' => self::ROWS_MEDIUM,
'id' => 'precisions_apport_liquide',
'onfocus' => 'this.rows = 10',
'onblur' => 'this.rows = 3'
]
])
->add('relais_financement', ChoiceType::class, [
'label' => 'Disposez-vous de relais de financement complémentaires ? (investisseurs, associés,…)',
'choices' => [
'Oui' => ProfilRepreneur::OUI,
'Non' => ProfilRepreneur::NON
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer si vous disposez de relais de financement complémentaires.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'relais_financement']
])
->add('precisions_relais_financement', TextareaType::class, [
'label' => 'Précisez',
'required' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez préciser vos relais de financement complémentaires.',
'groups' => ['publier'],
]),
],
'attr' => [
'class' => 'form-control',
'rows' => self::ROWS_MEDIUM,
'id' => 'precisions_relais_financement',
'onfocus' => 'this.rows = 10',
'onblur' => 'this.rows = 3'
]
])
->add('montant_total_mobilisable', NumberType::class, [
'label' => 'Si oui : Montant total que vous pensez pouvoir mobiliser pour une reprise (votre apport + soutiens éventuels)',
'required' => false,
'invalid_message' => 'Ce montant est invalide',
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer le montant total mobilisable pour la reprise.',
'groups' => ['publier'],
]),
new Montant()
],
'attr' => ['placeholder' => 'en €', 'id' => 'montant_total_mobilisable']
])
->add('financeurs_rencontres', ChoiceType::class, [
'label' => 'Avez-vous déjà rencontré des financeurs pour un projet de reprise ?',
'choices' => [
'Oui' => ProfilRepreneur::OUI,
'Non' => ProfilRepreneur::NON
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer si vous avez déjà rencontré des financeurs.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'financeurs_rencontres']
])
->add('precisions_financeurs_rencontres', TextareaType::class, [
'label' => 'Précisez',
'required' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez préciser les financeurs rencontrés.',
'groups' => ['publier'],
]),
],
'attr' => [
'class' => 'form-control',
'rows' => self::ROWS_MEDIUM,
'id' => 'precisions_financeurs_rencontres',
'onfocus' => 'this.rows = 10',
'onblur' => 'this.rows = 3'
]
])
->add('statut_residence', ChoiceType::class, [
'label' => 'Etes vous propriétaire ou locataire de votre résidence principale',
'choices' => [
'Je suis propriétaire' => ProfilRepreneur::STATUT_PROPRIETAIRE,
'Je suis locataire' => ProfilRepreneur::STATUT_LOCATAIRE
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer votre statut de résidence.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'statut_residence']
])
->add('annee_acquisition', HiddenType::class, [
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer l\'année d\'acquisition de votre résidence.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'annee_acquisition', 'v-model' => 'annee_acquisition']
])
->add('emprunt_restant', NumberType::class, [
'label' => 'Montant de l\'emprunt restant',
'required' => false,
'invalid_message' => 'Ce montant est invalide',
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer le montant de l\'emprunt restant.',
'groups' => ['publier'],
]),
new Montant()
],
'attr' => ['placeholder' => 'en €', 'id' => 'emprunt_restant']
])
->add('mensualites_emprunt', NumberType::class, [
'label' => 'Montant des mensualités',
'required' => false,
'invalid_message' => 'Ce montant est invalide',
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer le montant de vos mensualités d\'emprunt.',
'groups' => ['publier'],
]),
new Montant()
],
'attr' => ['placeholder' => 'en €', 'id' => 'mensualites_emprunt']
])
->add('montant_loyer', NumberType::class, [
'label' => 'Montant du loyer',
'required' => false,
'invalid_message' => 'Ce montant est invalide',
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer le montant de votre loyer.',
'groups' => ['publier'],
]),
new Montant()
],
'attr' => ['placeholder' => 'en €', 'id' => 'montant_loyer']
])
->add('salaire_espere', NumberType::class, [
'label' => 'Quel salaire esperez vous après la reprise ? (net mensuel après impôts)',
'required' => false,
'invalid_message' => 'Ce montant est invalide',
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer le salaire espéré après la reprise.',
'groups' => ['publier'],
]),
new Montant()
],
'attr' => ['placeholder' => 'en €', 'id' => 'salaire_espere']
])
->add('salaire_minimum', NumberType::class, [
'label' => 'De quel salaire avez-vous besoin au minimum pour vivre correctement ? (net mensuel après impôts)',
'required' => false,
'invalid_message' => 'Ce montant est invalide',
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer le salaire minimum dont vous avez besoin.',
'groups' => ['publier'],
]),
new Montant()
],
'attr' => ['placeholder' => 'en €', 'id' => 'salaire_minimum']
])
->add('id_pays', ChoiceType::class, [
"label" => "Pays",
"required" => false,
"choices" => FormChoices::selectionnerChoisir() + self::listIdPays(),
"attr" => [
'id' => 'id_pays',
"class" => "form-control"
]
])
->add('id_region', ChoiceType::class, [
"required" => false,
'invalid_message' => 'Ce id region est invalide',
'constraints' => [],
"choices" => FormChoices::selectionnerChoisir(),
"attr" => [
'id' => 'id_region',
"class" => "form-control"
],
])
->add('id_departement', ChoiceType::class, [
"required" => false,
'invalid_message' => 'Ce id departement est invalide',
'constraints' => [],
"choices" => FormChoices::selectionnerChoisir(),
"attr" => [
'id' => 'id_departement',
"class" => "form-control"
],
])
->add('code_postal', NumberType::class, [
'label' => 'Quel est votre code postal ?',
'required' => false,
'invalid_message' => 'Ce code postal est invalide',
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer votre code_postal.',
'groups' => ['publier'],
]),
new Montant()
],
'attr' => ['placeholder' => '', 'id' => 'code_postal']
])
// ===== TEMPS ET DISPONIBILITÉ =====
->add('mobilite_geographique', ChoiceType::class, [
'label' => 'Etes-vous mobile géographiquement ?',
'choices' => [
'Oui' => ProfilRepreneur::OUI,
'Non' => ProfilRepreneur::NON
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer si vous êtes mobile géographiquement.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'mobilite_geographique']
])
->add('situation_actuelle', ChoiceType::class, [
'label' => 'Quelle est votre situation actuelle ?',
'choices' => [
'En poste (salarié / dirigeant)' => ProfilRepreneur::SITUATION_EN_POSTE,
'En recherche (France Travail)' => ProfilRepreneur::SITUATION_EN_RECHERCHE
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer votre situation actuelle.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'situation_actuelle']
])
->add('disponibilite_plein_temps', ChoiceType::class, [
'label' => 'Êtes-vous disponible à plein temps pour vous impliquer dans le projet ?',
'choices' => [
'Oui' => ProfilRepreneur::OUI,
'Non' => ProfilRepreneur::NON
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer si vous êtes disponible à plein temps.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'disponibilite_plein_temps']
])
->add('precisions_disponibilite_plein_temps', TextareaType::class, [
'label' => 'Précisez',
'required' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez préciser votre disponibilité.',
'groups' => ['publier'],
]),
],
'attr' => [
'class' => 'form-control',
'rows' => self::ROWS_MEDIUM,
'id' => 'precisions_disponibilite_plein_temps',
'onfocus' => 'this.rows = 10',
'onblur' => 'this.rows = 3'
]
])
->add('situation_personnelle', ChoiceType::class, [
'label' => 'Situation personelle',
'choices' => [
'Célibataire' => ProfilRepreneur::SITUATION_CELIBATAIRE,
'En couple sans enfant à charge' => ProfilRepreneur::SITUATION_COUPLE_SANS_ENFANT,
'En couple avec enfant à charge' => ProfilRepreneur::SITUATION_COUPLE_AVEC_ENFANT
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer votre situation personnelle.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'situation_personnelle']
])
->add('situation_conjoint', ChoiceType::class, [
'label' => 'Quelle est la situation professionnelle de votre conjoint ?',
'choices' => [
'Salarié' => ProfilRepreneur::CONJOINT_SALARIE,
'Entrepreneur' => ProfilRepreneur::CONJOINT_ENTREPRENEUR,
'France Travail' => ProfilRepreneur::CONJOINT_FRANCE_TRAVAIL,
'Autre' => ProfilRepreneur::CONJOINT_AUTRE
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer la situation professionnelle de votre conjoint.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'situation_conjoint']
])
->add('precisions_situation_conjoint', TextareaType::class, [
'label' => 'Précisez',
'required' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez préciser la situation de votre conjoint.',
'groups' => ['publier'],
]),
],
'attr' => [
'class' => 'form-control',
'rows' => self::ROWS_MEDIUM,
'id' => 'precisions_situation_conjoint',
'onfocus' => 'this.rows = 10',
'onblur' => 'this.rows = 3'
]
])
// ===== RÉSEAUX ET SOUTIENS =====
->add('soutien_entourage', ChoiceType::class, [
'label' => 'Votre entourage personnel soutient-il ce projet ?',
'choices' => [
'Oui pleinement' => ProfilRepreneur::SOUTIEN_OUI_PLEINEMENT,
'Oui mais avec des réserves' => ProfilRepreneur::SOUTIEN_OUI_AVEC_RESERVES,
'Non, ce projet inquiète ou interroge' => ProfilRepreneur::SOUTIEN_NON_INQUIET,
'Je n\'en ai pas encore parlé' => ProfilRepreneur::SOUTIEN_PAS_ENCORE_PARLE
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer le soutien de votre entourage.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'soutien_entourage']
])
->add('precisions_soutien_entourage', TextareaType::class, [
'label' => 'Précisez',
'required' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez préciser le soutien de votre entourage.',
'groups' => ['publier'],
]),
],
'attr' => [
'class' => 'form-control',
'rows' => self::ROWS_MEDIUM,
'id' => 'precisions_soutien_entourage',
'onfocus' => 'this.rows = 10',
'onblur' => 'this.rows = 3'
]
])
->add('projet_plusieurs', ChoiceType::class, [
'label' => 'Seriez-vous prêt à envisager un projet à plusieurs ?',
'choices' => [
'Oui' => ProfilRepreneur::PROJET_OUI,
'Non' => ProfilRepreneur::PROJET_NON,
'Je n\'y ai pas réfléchi' => ProfilRepreneur::PROJET_PAS_REFLECHI
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer si vous envisagez un projet à plusieurs.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'projet_plusieurs']
])
->add('formation_reprise', ChoiceType::class, [
'label' => 'Avez-vous suivi une formation à la reprise d\'entreprise ?',
'choices' => [
'Oui' => ProfilRepreneur::FORMATION_OUI,
'J\'ai prévu d\'en suivre une prochainement' => ProfilRepreneur::FORMATION_PREVU,
'Non, ce n\'est pas envisagé pour le moment' => ProfilRepreneur::FORMATION_NON
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer si vous avez suivi une formation à la reprise.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'formation_reprise']
])
->add('precisions_formation_reprise', TextareaType::class, [
'label' => 'Précisez',
'required' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez préciser votre formation à la reprise.',
'groups' => ['publier'],
]),
],
'attr' => [
'class' => 'form-control',
'rows' => self::ROWS_MEDIUM,
'id' => 'precisions_formation_reprise',
'onfocus' => 'this.rows = 10',
'onblur' => 'this.rows = 3'
]
])
->add('accompagnement', HiddenType::class, [
'attr' => [],
'error_bubbling' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez sélectionner au moins un type d\'accompagnement.',
'groups' => ['publier'],
]),
]
])
->add('precisions_accompagnement', TextareaType::class, [
'label' => 'Précisions',
'required' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez préciser votre accompagnement.',
'groups' => ['publier'],
]),
],
'attr' => [
'class' => 'form-control',
'rows' => self::ROWS_MEDIUM,
'id' => 'precisions_accompagnement',
'onfocus' => 'this.rows = 10',
'onblur' => 'this.rows = 3'
]
])
->add('reseau_utile', ChoiceType::class, [
'label' => 'Disposez-vous d\'un réseau utile pour votre projet (clients, partenaires, secteur) ?',
'choices' => [
'Oui' => ProfilRepreneur::OUI,
'Non' => ProfilRepreneur::NON
],
'expanded' => true,
'multiple' => false,
'required' => true,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez indiquer si vous disposez d\'un réseau utile.',
'groups' => ['publier'],
]),
],
'attr' => ['id' => 'reseau_utile']
])
->add('precisions_reseau_utile', TextareaType::class, [
'label' => 'Précisez',
'required' => false,
'constraints' => [
new Assert\NotBlank([
'message' => 'Veuillez préciser votre réseau.',
'groups' => ['publier'],
]),
],
'attr' => [
'class' => 'form-control',
'rows' => self::ROWS_MEDIUM,
'id' => 'precisions_reseau_utile',
'onfocus' => 'this.rows = 10',
'onblur' => 'this.rows = 3'
]
]);
// ===== REGION LISTENER (inlined) =====
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$data = $event->getData();
if (!is_array($data) || !array_key_exists('id_pays', $data)) {
return;
}
$form = $event->getForm();
$id_pays = $data['id_pays'];
if (!$id_pays) {
$id_pays = array_combine(
array_map('mb_strtolower', array_column($this->params->get('app.pays_version'), 1)),
array_column($this->params->get('app.pays_version'), 4)
)[$_SESSION['codePays']];
}
if ($id_pays) {
$id_region = $data['id_region'] ?? null;
$regions = $this->lm->listRegionsByIdPays($id_pays, true);
$list_regions = FormChoices::selectionnerChoisir() + array_combine(
array_column($regions, "nom_localisation"),
array_column($regions, "id_localisation")
);
$form->add('id_region', ChoiceType::class, [
'choices' => $list_regions ?? FormChoices::selectionnerChoisir(),
'constraints' => [],
'attr' => ['autocomplete' => 'off', 'class' => 'form-control'],
'data' => $id_region,
]);
// --- Departement (inlined) ---
if ($id_region) {
$departements = $this->lm->listDepartementByIdRegion($id_region, true);
$list_departements = FormChoices::selectionnerChoisir() + array_combine(
array_column($departements, "nom_localisation"),
array_column($departements, "id_localisation")
);
} else {
$departements = [];
}
$form->add('id_departement', ChoiceType::class, [
'choices' => $list_departements ?? FormChoices::selectionnerChoisir(),
'constraints' => [],
'attr' => ['autocomplete' => 'off', 'class' => 'form-control'],
'data' => $data['id_departement'] ?? null,
]);
}
});
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
if (!is_array($data) || !array_key_exists('id_pays', $data)) {
return;
}
$id_pays = $data['id_pays'] ?? null;
$id_region = $data['id_region'] ?? null;
$regions = [];
if ($id_pays) {
$regions = $this->lm->listRegionsByIdPays($id_pays, true);
$list_regions = FormChoices::selectionnerChoisir() + array_combine(
array_column($regions, "nom_localisation"),
array_column($regions, "id_localisation")
);
$form->add('id_region', ChoiceType::class, [
'choices' => $list_regions ?? FormChoices::selectionnerChoisir(),
'constraints' => [],
'attr' => ['autocomplete' => 'off', 'class' => 'form-control'],
'data' => $id_region,
]);
}
// --- Departement (inlined) ---
if ($id_region) {
$departements = $this->lm->listDepartementByIdRegion($id_region, true);
$list_departements = FormChoices::selectionnerChoisir() + array_combine(
array_column($departements, "nom_localisation"),
array_column($departements, "id_localisation")
);
} else {
$departements = [];
}
$form->add('id_departement', ChoiceType::class, [
'choices' => $list_departements ?? FormChoices::selectionnerChoisir(),
'constraints' => [],
'attr' => ['autocomplete' => 'off', 'class' => 'form-control'],
'data' => $data['id_departement'] ?? null,
]);
});
}
}