<?php
namespace App\Controller\Front;
use App\Entity\Common\Adresse;
use App\Entity\Gestiform\Admin\Profil;
use App\Entity\Gestiform\Formations\Dossier\Dossier;
use App\Entity\Gestiform\Formations\Dossier\DossierAnnexes;
use App\Entity\Gestiform\Formations\Dossier\HistoriqueDossier;
use App\Entity\Gestiform\Formations\Entreprise\Contact;
use App\Entity\Gestiform\Formations\Entreprise\Entreprise;
use App\Entity\Gestiform\Formations\Session\Planning\Planning;
use App\Enums\TypeActifEnum;
use App\Form\Gestiform\Formations\Dossier\DossierInfosType;
use App\Form\Gestiform\Front\Inscription\EntrepriseInfosType;
use App\Service\Misc\ModelDocumentService;
use App\Service\Admin\MasterlistelgService;
use App\Service\Admin\ProfilService;
use App\Service\Admin\Users\UserService;
use App\Service\Formations\Catalogue\ParcoursService;
use App\Service\Formations\Dossier\DossierService;
use App\Service\Formations\Entreprise\EntrepriseService;
use App\Service\Formations\Sessions\SessionParcours\SessionParcoursService;
use App\Service\Front\InscriptionService;
use Doctrine\ORM\NonUniqueResultException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route(path: '/inscription', name: 'inscription_', host: '%front_domain%')]
class InscriptionController extends AbstractController
{
public function __construct(
private readonly DossierService $dossierService,
private readonly MasterlistelgService $masterlistelgService,
private readonly ParcoursService $parcoursService,
private readonly SessionParcoursService $sessionParcoursService,
private readonly InscriptionService $inscriptionService,
private readonly ModelDocumentService $modelDocumentService,
private readonly ProfilService $profilService,
private readonly UserService $userService,
private readonly EntrepriseService $entrepriseService
)
{
}
#[Route(path: '/prospect', name: 'prospect')]
public function profilProspect(): Response
{
$profils = $this->profilService->getAll();
return $this->render('front/inscription/prospect/inscription.html.twig', [
'profils' => $profils,
'vueData' => [],
]);
}
#[Route(path: '/postulant', name: 'postulant')]
public function inscriptionPostulant(): Response
{
$addPostulantForm = $this->createForm(
DossierInfosType::class,
new Dossier(),
[
'action' => $this->generateUrl(
"inscription_add_postulant",
),
]
);
return $this->render('front/inscription/postulant/inscription.html.twig', [
'addPostulantForm' => $addPostulantForm->createView(),
'vueData' => []
]);
}
/**
* @throws NonUniqueResultException
*/
#[Route(path: '/{id}/valider-devis', name: 'valider_devis', requirements: ['id' => '\d+'])]
public function traiterDevis(Entreprise $entreprise, Request $request): Response
{
$modules = $request->request->get('modules', []);
$this->inscriptionService->addDevisEntreprise($entreprise, $modules);
return $this->redirectToRoute('inscription_profil');
}
#[Route(path: '/{id}/prospect', name: 'prospect_inscription', requirements: ['id' => '\d+'])]
public function inscriptionProspect(Profil $profil = null): Response
{
if (!$profil) {
throw $this->createNotFoundException("Le profil sélectionné est introuvable.");
}
$addProspectForm = $this->createForm(
DossierInfosType::class,
new Dossier(),
[
'action' => $this->generateUrl("inscription_add_prospect"
, ['id' => $profil->getId()]),
]
);
return $this->render('front/inscription/prospect/inscriptionProspect.html.twig', [
'addProspectForm' => $addProspectForm->createView(),
'vueData' => [],
]);
}
#[Route(path: '/{id}/devis', name: 'devis', requirements: ['id' => '\d+'])]
public function devisEntreprise(Entreprise $entreprise = null): Response
{
return $this->render('front/inscription/prospect/devis.html.twig', [
'vueData' => ['card' => $entreprise->getCart()],
'entreprise' => $entreprise
]);
}
#[Route(path: '/entreprise', name: 'entreprise')]
public function inscriptionEntreprise(): Response
{
$addEntrepriseForm = $this->createForm(
EntrepriseInfosType::class,
new Entreprise(),
[
'action' => $this->generateUrl("inscription_add_entreprise"),
]
);
return $this->render('front/inscription/prospect/inscriptionEntreprise.html.twig', [
'addEntrepriseForm' => $addEntrepriseForm->createView(),
'vueData' => [],
]);
}
#[Route(path: '/prospect/redirect', name: 'prospect_redirect', methods: ['POST'])]
public function redirectProspect(Request $request): Response
{
$selectedProfilId = $request->request->get('selectedProfil');
$profil = $this->profilService->get((int)$selectedProfilId);
if (!$profil) {
$this->addFlash('error', 'Le profil sélectionné est introuvable.');
return $this->redirectToRoute('inscription_profil');
}
if ($profil->getId() != 1) {
return $this->redirectToRoute('inscription_prospect_inscription', ['id' => $profil->getId()]);
}
return $this->redirectToRoute('inscription_entreprise');
}
/**
* @throws NonUniqueResultException
*/
#[Route(path: '/{id}/add/prospect', name: 'add_prospect', methods: ['POST'])]
public function addProspect(Profil $profil, Request $request): Response
{
$data = $request->request->get("dossier_infos");
$events = $data['events']??null;
if (empty($data['emailCandidature'])) {
return $this->json(["error" => "Le champ 'Email notification' est vide. Vous devez sélectionner un email notification."], 400);
}
if (empty($data['personalInformations']['civilite'])) {
return $this->json(["error" => "Le champ 'Civilité' est vide. Vous devez sélectionner une civilité."], 400);
}
if (empty($data['personalInformations']['nom'])) {
return $this->json(["error" => "Le champ 'Nom' est vide. Vous devez ajouter un non."], 400);
}
if (empty($data['personalInformations']['prenom'])) {
return $this->json(["error" => "Le champ 'Prenom' est vide. Vous devez ajouter un prenom."], 400);
}
if (empty($data['personalInformations']['dateNaissance'])) {
return $this->json(["error" => "Le champ 'Date de Naissance' est vide. Vous devez ajouter une date de Naissance."], 400);
}
if (empty($data['personalInformations']['villeNaissance'])) {
return $this->json(["error" => "Le champ 'Lieu de Naissance' est vide. Vous devez ajouter un lieu de Naissance."], 400);
}
if (empty($data['personalInformations']['nationalite'])) {
return $this->json(["error" => "Le champ 'Nationalité' est vide. Vous devez ajouter une nationalité."], 400);
}
if (empty($data['personalInformations']['mobile'])) {
return $this->json(["error" => "Le champ 'Tel Mobile' est vide. Vous devez ajouter un Tel Mobile."], 400);
}
$selectedModules = $data["modules"] ?? null;
$dossier = new Dossier();
$dossier->setProspectAvailable(true);
$dossier->setDossierannexes(new DossierAnnexes())
->setAdresse(new Adresse())
->setPlanning(new Planning());
$typeActif = $this->masterlistelgService->getRepository()->getOneByListeCode('DOSSIER', 'STATUTDOSSIER', TypeActifEnum::PROSPECT->value);
$dossier->setTypeActif($typeActif);
$form = $this->createForm(DossierInfosType::class, $dossier);
$form->handleRequest($request);
if ($form->isSubmitted() /*&& $form->isValid()*/) {
$dossier->setProfil($profil);
$this->dossierService->persist($dossier, true);
if (!empty($events)) {
$this->inscriptionService->addEvents($events, $dossier);
}
if(!empty($selectedModules)) {
$this->inscriptionService->addModules($selectedModules, $dossier);
}
$dossier = $this->inscriptionService->initDossierProspect($dossier, $typeActif);
$model='email_reception_demande_devis';
$data = [ "dossier" => $dossier];
try {
$this->modelDocumentService->generateEmail($model, $data, $dossier->getEmailCandidature());
} catch (TransportExceptionInterface|LoaderError|RuntimeError|SyntaxError $e) {
}
return $this->json($this->dossierService->serializeInfosGeneralesSection($dossier));
}
return $this->json('error', 500);
}
/**
* @throws NonUniqueResultException
* @throws \JsonException
*/
#[Route(path: '/add/postulant', name: 'add_postulant', methods: ['POST'])]
public function addPostulant(Request $request): Response
{
$data = $request->request->get("dossier_infos");
if (empty($data['profil'])) {
return $this->json(["error" => "Le champ 'Profil' est vide. Vous devez sélectionner un profil."], 400);
}
if (empty($data['typeFormation'])) {
return $this->json(["error" => "Le champ 'Type de formation' est vide. Vous devez sélectionner un type de formation."], 400);
}
if (empty($data['dispositif'])) {
return $this->json(["error" => "Le champ 'Dispositif' est vide. Vous devez sélectionner un dispositif."], 400);
}
$selectedParcours = ($data["parcours"] == "0") ? null : $data["parcours"];
if (empty($selectedParcours)) {
return $this->json(["error" => "Le champ 'Parcours' est vide. Vous devez sélectionner un parcours."], 400);
}
$selectedTypeFormation = $data["typeFormation"];
$selectedDispositif = $data["dispositif"];
$selectedParcours = ($data["parcours"] == "0") ? null : $data["parcours"];
$selectedSessions = null;
$dossier = new Dossier();
$dossier->setPostulantAvailable(true);
$dossier->setDossierannexes(new DossierAnnexes())
->setAdresse(new Adresse())
->setPlanning(new Planning());
$typeActif = $this->masterlistelgService->getRepository()->getOneByListeCode('DOSSIER', 'STATUTDOSSIER', TypeActifEnum::POSTULANT->value);
$dossier->setTypeActif($typeActif);
$form = $this->createForm(DossierInfosType::class, $dossier, [
'selectedDispositif' => $this->masterlistelgService->getRepository()->find($selectedDispositif),
'selectedTypeFormation' => $this->masterlistelgService->getRepository()->find($selectedTypeFormation),
'selectedParcours' => $selectedParcours ? $this->parcoursService->getRepository()->find($selectedParcours) : null,
'selectedSessions' => $selectedSessions ? $this->sessionParcoursService->getRepository()->find($selectedSessions) : null,
]);
$form->handleRequest($request);
if ($form->isSubmitted() /*&& $form->isValid()*/) {
$this->dossierService->persist($dossier, true);
$historiqueDossier = new HistoriqueDossier();
$historiqueDossier->setDossier($dossier)
->setType("statut")
->setStatut($typeActif);
$model='email_reception_candidature';
$data = [ "dossier" => $dossier];
try {
$this->modelDocumentService->generateEmail($model, $data, $dossier->getEmailCandidature());
} catch (TransportExceptionInterface|LoaderError|RuntimeError|SyntaxError $e) {
}
return $this->json($this->dossierService->serializeInfosGeneralesSection($dossier));
}
return $this->json('error', 500);
}
#[Route(path: '/add/entreprise', name: 'add_entreprise', methods: ['POST'])]
public function addEntreprise(Request $request): Response
{
$entreprise = new Entreprise();
$contact = new Contact();
$entreprise->setDelegataire(false);
$data = $request->request->get('entreprise_infos');
if (empty($data['raisonSociale'])) {
return $this->json(["error" => "Le champ 'Raison Sociale' est vide. Vous devez ajouter un raison sociale."], 400);
}
if (empty($data['email'])) {
return $this->json(["error" => "Le champ 'Email' est vide. Vous devez ajouter un email."], 400);
}
if (empty($data['mobile'])) {
return $this->json(["error" => "Le champ 'Téléphone mobile' est vide. Vous devez ajouter un mobile."], 400);
}
if (empty($data['siren'])) {
return $this->json(["error" => "Le champ 'Siret' est vide. Vous devez ajouter une siren."], 400);
}
if (empty($data['numtva'])) {
return $this->json(["error" => "Le champ 'N° TVA' est vide. Vous devez ajouter un N° TVA."], 400);
}
if (empty($data['naf'])) {
return $this->json(["error" => "Le champ 'NAF' est vide. Vous devez sélectionner un NAF."], 400);
}
if (empty($data['modules'])) {
return $this->json(["error" => "Le champ 'modules' est vide. Vous devez sélectionner un module."], 400);
}
$contactData = $data['contact'] ?? null;
if (empty($contactData['personalInformations']['civilite'])) {
return $this->json(["error" => "Le champ 'Civilité' est vide. Vous devez sélectionner une civilité."], 400);
}
if (empty($contactData['personalInformations']['nom'])) {
return $this->json(["error" => "Le champ 'Nom' est vide. Vous devez sélectionner un nom."], 400);
}
if (empty($contactData['personalInformations']['prenom'])) {
return $this->json(["error" => "Le champ 'Prenom' est vide. Vous devez sélectionner un prenom."], 400);
}
if (empty($contactData['email'])) {
return $this->json(["error" => "Le champ 'Email Contact' est vide. Vous devez ajouter un email."], 400);
}
$selectedModules = ($data["modules"] == "0") ? null : $data["modules"];
$contact = $this->inscriptionService->addContact($contactData, $contact);
$form = $this->createForm(EntrepriseInfosType::class, $entreprise);
$form->handleRequest($request);
if ($form->isSubmitted() /*&& $form->isValid()*/) {
$user = $this->userService->getRepository()->findOneBy(['email' => $entreprise->getEmail()]);
if ($user) {
return $this->json(['error' => 'cette adresse email est déja prise'], 400);
}
$this->inscriptionService->addModulesEntreprise($entreprise, $selectedModules);
$this->entrepriseService->persist($entreprise, true);
$contact->setTiers($entreprise);
$this->entrepriseService->flush();
$model='email_reception_candidature_entreprise';
$data = [ "entreprise" => $entreprise];
try {
$this->modelDocumentService->generateEmail($model, $data, $entreprise->getEmail());
} catch (TransportExceptionInterface|LoaderError|RuntimeError|SyntaxError $e) {
}
return $this->json($this->entrepriseService->serializeInfosGeneralessSection($entreprise));
}
foreach ($form->getErrors(true) as $error) {
if ($error->getOrigin()->getName() === 'email' && $error->getMessage() === 'cette adresse email est déja prise') {
return $this->json(['error' => 'cette adresse email est déja prise'], 400);
}
}
return $this->json(["error" => true], 200);
}
}