<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Services\RoleService;
use App\Services\FileUploader;
use App\Services\Utils;
use App\Form\signup\SignupUserType;
use App\Form\signup\SignupStep1_1_0Type;
use App\Form\signup\SignupStep1_2_0Type;
use App\Form\signup\SignupStep1_3_0Type;
use App\Form\signup\SignupStep1_4_0Type;
use App\Form\signup\SignupStep1_5_0Type;
use App\Form\signup\SignupStep2_1_0Type;
use App\Form\signup\SignupStep2_2_0Type;
use App\Form\signup\SignupStep2_4_0Type;
use App\Form\signup\SignupStep2_5_0Type;
use App\Form\signup\SignupStep2_6_0Type;
use App\Form\signup\SignupStep2_8_0Type;
use App\Form\signup\SignupStep2_9_0Type;
use App\Form\signup\SignupStep3_1_0Type;
use App\Form\signup\SignupStep3_2_0Type;
use App\Form\signup\SignupStep3_3_0Type;
use App\Form\signup\SignupStep3_4_0Type;
use App\Form\signup\SignupStep3_4_1Type;
use App\Form\signup\SignupStep3_5_0Type;
use App\Form\signup\SignupStep4_1_0Type;
use App\Form\signup\SignupStep4_2_0Type;
use App\Form\signup\SignupStep5_1_0Type;
use App\Form\signup\SignupStep5_2_0Type;
use App\Form\signup\SignupStep5_3_0Type;
use App\Form\signup\SignupStep6_2_0Type;
use App\Form\signup\SignupStep6_3_0Type;
use App\Entity\User;
use App\Entity\Membership;
use App\Entity\FileSend;
use App\Entity\Fic;
use App\Entity\Ba;
/**
* @Route("/")
*/
class SignupController extends AbstractController
{
protected $em;
protected $fileUploader;
protected $utils;
public function __construct(EntityManagerInterface $entityManager, \Swift_Mailer $mailer, FileUploader $fileUploader, Utils $utils, TranslatorInterface $translator, \Knp\Snappy\Pdf $knpSnappy, RoleService $roleService) {
$this->em = $entityManager;
$this->mailer = $mailer;
$this->fileUploader = $fileUploader;
$this->utils = $utils;
$this->translator = $translator;
$this->knpSnappy = $knpSnappy;
$this->roleService = $roleService;
}
/**
* @Route("nouvelle-adhesion-retraite/{token?}/{action?}/{stepForAction?}", name="member_signup_retraite")
*/
public function signupRetraite(Request $request, ?String $token = null, ?string $action = null, ?string $stepForAction = null){
return $this->signup($request, $token, $action, $stepForAction, "retraite");
}
/**
* @Route("nouvelle-adhesion-epargne/{token?}/{action?}/{stepForAction?}", name="member_signup_epargne")
*/
public function signupEpargne(Request $request, ?String $token = null, ?string $action = null, ?string $stepForAction = null){
return $this->signup($request, $token, $action, $stepForAction, "epargne");
}
/**
* @Route("nouvelle-adhesion/{token?}/{action?}/{stepForAction?}", name="member_signup")
*/
public function signup(Request $request, ?String $token = null, ?string $action = null, ?string $stepForAction = null, ?string $product = "retraite"){
//Initial variables
$step = "0";
$previousStep = null;
$nextStep = null;
$errorEnd = null;
$form = null;
$ba = null;
$fic = null;
$user = null;
$membership = null;
$finalStep = false;
$productType = $product;
if($token && $token != "noToken"){
$user = $this->em
->getRepository(User::class)
->findOneBy(['tokenSignupContinue' => $token]);
if(!$user){
$this->addFlash('danger', 'Cette adhésion n\'existe pas');
if($this->getUser()){
$userCurrent = $this->get('security.token_storage')->getToken()->getUser();
if($this->roleService->isGranted('ROLE_CUSTOMER', $userCurrent) && $userCurrent->isIsAutoSignup()){
return $this->redirectToRoute('member_signup', array("token" => $userCurrent->getTokenSignupContinue()));
}
else{
$this->addFlash('danger', 'Vous êtes connecté sur un compte non compatbile avec la création d\'une adhésion autonome');
return $this->redirectToRoute('app_login');
}
}
return $this->redirectToRoute('member_signup', array("token" => null));
}
// Authenticating user
if($user && !$this->getUser()){
if($this->roleService->isGranted('ROLE_CUSTOMER', $user)){
$tokenUserTemp = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.token_storage')->setToken($tokenUserTemp);
$this->get('session')->set('_security_main', serialize($tokenUserTemp));
$user->setLastLogin(new \DateTime());
$this->em->persist($user);
$this->em->flush();
}
}
else{
$user->setLastOpenDate(new \DateTime());
$this->em->persist($user);
$this->em->flush();
}
//If no membership
$membershipCurrent = $this->utils->getMembershipByCustomer($user);
$membership = $membershipCurrent;
$ba = $membership->getBa();
$fic = $membership->getFic();
$productType = $membership->getProduct();
//Same entity as BA
$sepa = $membership->getBa();
$step = $user->getStepSignup();
$productType = $membership->getProduct();
if ($this->getParameter('kernel.environment') === 'dev') {
//Generate fic file
$ficName = $this->utils->generateFicFullweb($user);
//Generate ba file
$baName = $this->utils->generateBaFullweb($user);
//Generate sepa file
$sepaName = $this->utils->generateSepa($user);
$fic->setUrlPdf($ficName);
$ba->setUrlPdf($baName);
$ba->setSepaUrlPdf($sepaName);
$this->em->persist($fic);
$this->em->persist($ba);
$this->em->flush();
}
if($step == "0"){
$previousStep = null;
$form = $this->createForm(SignupUserType::class, $user, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
//Birthday date
if($user->getDateDeNaissance()){
$dateDeNaissance = str_replace("/", "-", $user->getDateDeNaissance());
$user->setDateDeNaissance(new \DateTime(date("Y-m-d", strtotime($dateDeNaissance))));
} else{
$user->setDateDeNaissance(null);
}
if($user->isAdresseFiscaleFrance() == 0){
$user->setStepSignup("0.0.end");
}
else{
if($productType == "epargne"){
$user->setStepSignup("2");
}
else{
$user->setStepSignup("1");
}
}
$this->em->persist($user);
$this->em->flush($user);
$fic->setSex($user->getSex());
$fic->setEmail($user->getEmail());
$fic->setDateDeNaissance($user->getDateDeNaissance());
$fic->setNom($user->getLastName());
$fic->setPrenom($user->getFirstName());
$fic->setAdresseFiscaleResidenceFrance(false);
$ba->setSex($user->getSex());
$ba->setEmail($user->getEmail());
$ba->setDateDeNaissance($user->getDateDeNaissance());
$ba->setNom($user->getLastName());
$ba->setPrenom($user->getFirstName());
$ba->setResidenceFrance(true);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "0.0.end"){
$previousStep = "0";
$errorEnd = array("title" => "Fin de parcours", "description" => "Seuls les personnes résidents fiscalement en France peuvent souscrire");
}
if($step == "1"){
$previousStep = "0";
$nextStep = "1.1.0";
}
if($step == "1.1.0"){
$previousStep = "1";
$form = $this->createForm(SignupStep1_1_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($ba->getTitulaireTitre() == "0"){
$user->setStepSignup("1.2.0");
}
else{
$user->setStepSignup("1.4.0");
$ba->setEngageFournirCopieTitreAttribue(true);
}
$this->em->persist($user);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "1.2.0"){
$previousStep = "1.1.0";
$form = $this->createForm(SignupStep1_2_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
//getDateCarteCombattant
if($ba->getDateCarteCombattant()){
$dateCarteCombattant = str_replace("/", "-", $ba->getDateCarteCombattant());
$ba->setDateCarteCombattant(new \DateTime(date("Y-m-d", strtotime($dateCarteCombattant))));
} else{
$ba->setDateCarteCombattant(null);
}
//getDateReconnaisanceNation
if($ba->getDateReconnaisanceNation()){
$dateReconnaisanceNation = str_replace("/", "-", $ba->getDateReconnaisanceNation());
$ba->setDateReconnaisanceNation(new \DateTime(date("Y-m-d", strtotime($dateReconnaisanceNation))));
} else{
$ba->setDateReconnaisanceNation(null);
}
//getDateTranscriptionMention
if($ba->getDateTranscriptionMention()){
$dateTranscriptionMention = str_replace("/", "-", $ba->getDateTranscriptionMention());
$ba->setDateTranscriptionMention(new \DateTime(date("Y-m-d", strtotime($dateTranscriptionMention))));
} else{
$ba->setDateTranscriptionMention(null);
}
if($ba->getDateCarteCombattant() || $ba->getDateReconnaisanceNation()){
//false == Oui (warning)
$fic->setReconnaisanceNation(false);
if($ba->getDateReconnaisanceNation()){
$fic->setDateReconnaisanceNation($ba->getDateReconnaisanceNation());
}
if($ba->getDateCarteCombattant()){
$fic->setDateReconnaisanceNation($ba->getDateCarteCombattant());
}
}
else{
//True == Non
$fic->setReconnaisanceNation(true);
$fic->setDateReconnaisanceNation(null);
}
$fic->setReconnaisanceNation($ba->getDateReconnaisanceNation() ? false : true);
$fic->setDateReconnaisanceNation($ba->getDateReconnaisanceNation());
$user->setStepSignup("1.3.0");
$this->em->persist($user);
$this->em->persist($ba);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "1.3.0"){
$previousStep = "1.2.0";
$form = $this->createForm(SignupStep1_3_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user->setStepSignup("1.4.0");
$this->em->persist($user);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "1.4.0"){
if($ba->getTitulaireTitre() == "0"){
$previousStep = "1.3.0";
}
else{
$previousStep = "1.1.0";
}
//OTHER CONTRACTS FORM
$originalOtherContracts = new ArrayCollection();
// Create an ArrayCollection of the current Tag objects in the database
foreach ($ba->getOtherContracts() as $otherContract) {
$originalOtherContracts->add($otherContract);
}
$form = $this->createForm(SignupStep1_4_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
// remove the relationship between the OtherContract and the BA
foreach ($originalOtherContracts as $otherContract) {
if (false === $ba->getOtherContracts()->contains($otherContract)) {
// To delete the Tag entirely
$this->em->remove($otherContract);
}
}
//Update date fro the OtherContract
foreach ($ba->getOtherContracts() as $otherContract) {
if($otherContract->getDateAdhesion()){
$dateAdhesion = str_replace("/", "-", $otherContract->getDateAdhesion());
$otherContract->setDateAdhesion(new \DateTime(date("Y-m-d", strtotime($dateAdhesion))));
} else{
$otherContract->setDateAdhesion(null);
}
$this->em->persist($otherContract);
}
$user->setStepSignup("1.5.0");
$this->em->persist($user);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "1.5.0"){
$previousStep = "1.4.0";
$form = $this->createForm(SignupStep1_5_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($ba->isObjectifPrincipalConstitutionRetraite() == 0){
$user->setStepSignup("1.5.end");
}
else{
$user->setStepSignup("2");
}
$this->em->persist($user);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "1.5.end"){
$previousStep = "1.5.0";
$errorEnd = array("title" => "Fin de parcours", "description" => "Vous avez indiqué que votre objectif principal n’est pas la constitution d'une retraite supplémentaire. Nous vous invitons à prendre contact avec un conseiller MER.");
}
if($step == "2"){
if($productType == "epargne"){
$previousStep = "0";
}
else{
$previousStep = "1.5.0";
}
$nextStep = "2.1.0";
}
if($step == "2.1.0"){
$previousStep = "2";
$form = $this->createForm(SignupStep2_1_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($ba->isGreenCard() == 1){
$user->setStepSignup("2.1.end");
}
else{
$user->setStepSignup("2.2.0");
}
$fic->setNationalite($ba->getNationalite());
$fic->setLieuDeNaissance($ba->getLieuVilleDeNaissance()." ".$ba->getLieuCodePostalDeNaissance()." ".$ba->getLieuPaysDeNaissance());
$ba->setLieuDeNaissance($ba->getLieuVilleDeNaissance()." ".$ba->getLieuCodePostalDeNaissance()." ".$ba->getLieuPaysDeNaissance());
$this->em->persist($user);
$this->em->persist($ba);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "2.1.end"){
$previousStep = "2.1.0";
$errorEnd = array("title" => "Fin de parcours", "description" => "Vous avez indiqué avoir la Green Card et être citoyen américain.<br/><br/>
Votre situation particulière nécessite une étude approfondie de votre dossier. Nous vous invitons à prendre contact avec notre service commercial.");
}
if($step == "2.2.0"){
$previousStep = "2.1.0";
$form = $this->createForm(SignupStep2_2_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$fic->setAdresseFiscale($ba->getFiscaleAddress());
$fic->setAdresseFiscaleCodePostal($ba->getFiscaleCodePostal());
$fic->setAdresseFiscaleVille($ba->getFiscaleVille());
$fic->setAdresseFiscalePays($ba->getFiscalePays());
$fic->setAdressePostale($ba->getNumeroDeVoie());
$fic->setAdresseCodePostal($ba->getCodePostal());
$fic->setAdresseVille($ba->getVille());
$fic->setAdressePays($ba->getPays());
$user->setStepSignup("2.4.0");
$this->em->persist($user);
$this->em->persist($ba);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "2.3.0"){
//CODE NIF NO DEV
}
if($step == "2.4.0"){
$previousStep = "2.2.0";
$form = $this->createForm(SignupStep2_4_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($fic->isBeneficiezProtectionJuridique() == 0){
$user->setStepSignup("2.4.end");
}
else{
$user->setStepSignup("2.5.0");
}
$this->em->persist($user);
$this->em->persist($fic);
//Update BA
$ba->setProfessionCspCategory($fic->getProfessionCspCategory());
$ba->setProfessionCspSousCategory($fic->getProfessionCspSousCategory());
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "2.4.end"){
$previousStep = "2.4.0";
$errorEnd = array("title" => "Fin de parcours", "description" => "Votre situation particulière nécessite une étude approfondie de votre dossier. Nous vous invitons à prendre contact avec notre service commercial.");
}
if($step == "2.5.0"){
$previousStep = "2.4.0";
$form = $this->createForm(SignupStep2_5_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user->setStepSignup("2.6.0");
$this->em->persist($user);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "2.6.0"){
$previousStep = "2.5.0";
$form = $this->createForm(SignupStep2_6_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($productType == "epargne"){
$user->setStepSignup("2.7");
}
else{
$user->setStepSignup("2.7.0");
}
$this->em->persist($user);
$this->em->persist($fic);
//Update BA
$ba->setSituationFamilliale($fic->getSituationFamilliale());
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
//Just for epargne
if($step == "2.7"){
$previousStep = "2.6.0";
$nextStep = "2.7.0";
}
if($step == "2.7.0"){
if($productType == "epargne"){
$previousStep = "2.7";
}
else{
$previousStep = "2.6.0";
}
$nextStep = "2.8.0";
}
if($step == "2.8.0"){
$previousStep = "2.7.0";
$form = $this->createForm(SignupStep2_8_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($fic->isPrefInvestiDurabilite()){
$user->setStepSignup("2.9.0");
}
else{
$user->setStepSignup("3");
}
$this->em->persist($user);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "2.9.0"){
$previousStep = "2.8.0";
$form = $this->createForm(SignupStep2_9_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($fic->isPrefInvestiDurabiliteConfirmationAdhesion() == "0"){
$user->setStepSignup("2.9.end");
}
else{
$user->setStepSignup("3");
}
$this->em->persist($user);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "2.9.end"){
$previousStep = "2.9.0";
$errorEnd = array("title" => "Fin de parcours", "description" => "Votre situation particulière nécessite une étude approfondie de votre dossier. Nous vous invitons à prendre contact avec notre service commercial.");
}
if($step == "3"){
if($fic->isPrefInvestiDurabilite()){
$previousStep = "2.9.0";
}
else{
$previousStep = "2.8.0";
}
$nextStep = "3.1.0";
}
if($step == "3.1.0"){
$previousStep = "3";
$form = $this->createForm(SignupStep3_1_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user->setStepSignup("3.2.0");
$this->em->persist($user);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "3.2.0"){
$previousStep = "3.1.0";
$form = $this->createForm(SignupStep3_2_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user->setStepSignup("3.3.0");
$this->em->persist($user);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "3.3.0"){
$previousStep = "3.2.0";
$form = $this->createForm(SignupStep3_3_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user->setStepSignup("3.4.0");
$this->em->persist($user);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "3.4.0"){
$previousStep = "3.3.0";
$form = $this->createForm(SignupStep3_4_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($productType == "epargne"){
if($fic->getObjectifsEpargnePriorite() == "1"){
$user->setStepSignup("3.4.end");
}
else{
$user->setStepSignup("3.4.1");
}
}
else{
$user->setStepSignup("3.5.0");
}
$this->em->persist($user);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "3.4.end"){
$previousStep = "3.4.0";
$errorEnd = array("title" => "Fin de parcours", "description" => "Votre situation particulière nécessite une étude approfondie de votre dossier. Nous vous invitons à prendre contact avec notre service commercial.");
}
if($step == "3.4.1"){
$previousStep = "3.4.0";
$form = $this->createForm(SignupStep3_4_1Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user->setStepSignup("3.5.0");
$this->em->persist($user);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "3.5.0"){
if($productType == "epargne"){
$previousStep = "3.4.1";
}
else{
$previousStep = "3.4.0";
}
$form = $this->createForm(SignupStep3_5_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user->setStepSignup("3.6.0");
$this->em->persist($user);
$this->em->persist($fic);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "3.6.0"){
$previousStep = "3.5.0";
$nextStep = "4";
}
if($step == "4"){
$previousStep = "3.6.0";
if($productType == "epargne"){
$nextStep = "4.2.0";
}
else{
$nextStep = "4.1.0";
}
}
if($step == "4.1.0"){
$previousStep = "4";
$form = $this->createForm(SignupStep4_1_0Type::class, $fic, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($fic->getSouscrireRetraiteMutualistePourConstituer() == 2){
$user->setStepSignup("5");
}
else{
$user->setStepSignup("4.2.0");
}
$ba->setOptionCapital($fic->getSouscrireRetraiteMutualistePourConstituer());
$this->em->persist($user);
$this->em->persist($fic);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "4.2.0"){
if($productType == "epargne"){
$previousStep = "4";
}
else{
$previousStep = "4.1.0";
}
//BENEFICIAIRES FORM
$originalBeneficiaires = new ArrayCollection();
// Create an ArrayCollection of the current Tag objects in the database
foreach ($ba->getBeneficiaires() as $beneficiaire) {
$originalBeneficiaires->add($beneficiaire);
}
$form = $this->createForm(SignupStep4_2_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
// remove the relationship between the Beneficiaire and the BA
foreach ($originalBeneficiaires as $beneficiaire) {
if (false === $ba->getBeneficiaires()->contains($beneficiaire)) {
// To delete the Tag entirely
$this->em->remove($beneficiaire);
}
}
//Update date fro the Beneficiaire
foreach ($ba->getBeneficiaires() as $beneficiaire) {
if($beneficiaire->getDateDeNaissance()){
$dateAdhesion = str_replace("/", "-", $beneficiaire->getDateDeNaissance());
$beneficiaire->setDateDeNaissance(new \DateTime(date("Y-m-d", strtotime($dateAdhesion))));
} else{
$beneficiaire->setDateDeNaissance(null);
}
$this->em->persist($beneficiaire);
}
$user->setStepSignup("5");
$this->em->persist($user);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "5"){
if($productType == "retraite"){
if($fic->getSouscrireRetraiteMutualistePourConstituer() == 2){
$previousStep = "4.1.0";
}
else{
$previousStep = "4.2.0";
}
}
else{
$previousStep = "4.2.0";
}
$nextStep = "5.1.0";
}
if($step == "5.1.0"){
$previousStep = "5";
$form = $this->createForm(SignupStep5_1_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
//getDateEffetAdhesion
$ba->setDateEffetAdhesion(new \DateTime("now"));
//getDateDeLiquidation
if($productType == "retraite"){
if($ba->getDateDeLiquidation()){
$dateDeLiquidation = str_replace("/", "-", $ba->getDateDeLiquidation());
$ba->setDateDeLiquidation(new \DateTime(date("Y-m-d", strtotime($dateDeLiquidation))));
} else{
$ba->setDateDeLiquidation(null);
}
}
$ba->setMoyenDeVersement("3");
$user->setStepSignup("5.2.0");
$this->em->persist($user);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "5.2.0"){
$previousStep = "5.1.0";
$form = $this->createForm(SignupStep5_2_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user->setStepSignup("5.3.0");
$this->em->persist($user);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "5.3.0"){
$previousStep = "5.2.0";
$form = $this->createForm(SignupStep5_3_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$user->setStepSignup("6");
$this->em->persist($user);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "6"){
$previousStep = "5.3.0";
$nextStep = "6.1.0";
$finalStep = true;
}
if($step == "6.1.0"){
$previousStep = "6";
$nextStep = "6.2.0";
$finalStep = true;
}
if($step == "6.2.0"){
$previousStep = "6.1.0";
$finalStep = true;
$form = $this->createForm(SignupStep6_2_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$iban = $ba->getSepaCodeIban();
$iban = str_replace(" ", "", $iban);
$bic = $ba->getSepaCodeBic();
$bic = str_replace(" ", "", $bic);
$ba->setSepaCodeIban($iban);
$ba->setSepaCodeBic($bic);
$user->setStepSignup("6.3.0");
$this->em->persist($user);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "6.3.0"){
$previousStep = "6.2.0";
$finalStep = true;
//Generate fic file
$ficName = $this->utils->generateFicFullWeb($user);
//Generate ba file
$baName = $this->utils->generateBaFullWeb($user);
//Generate sepa file
$sepaName = $this->utils->generateSepa($user);
$fic->setUrlPdf($ficName);
$ba->setUrlPdf($baName);
$ba->setSepaUrlPdf($sepaName);
$this->em->persist($fic);
$this->em->persist($ba);
$this->em->flush();
//Send mail for customer
$this->sendMailFolder($membershipCurrent);
//Generate form
$form = $this->createForm(SignupStep6_3_0Type::class, $ba, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if($productType == "epargne"){
if($ba->isJeDemandeAdhesionProduit() == false){
$user->setStepSignup("6.3.end");
}
else{
$user->setStepSignup("6.4.0");
}
}
else{
$user->setStepSignup("6.4.0");
$ba->setReconnaisEtreInforme(true);
$ba->setConnaissanceDesStatuts(true);
$ba->setReconnaisRenoncer30Jours(true);
$ba->setReconnaisAvoirPrisConnaissance(true);
}
$membershipCurrent->setValidatedFolderByCustomer(true);
$this->em->persist($user);
$this->em->persist($membershipCurrent);
$this->em->persist($ba);
$this->em->flush();
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
}
if($step == "6.3.end"){
$finalStep = true;
$previousStep = "6.3.0";
$errorEnd = array("title" => "Fin de parcours", "description" => "Votre situation particulière nécessite une étude approfondie de votre dossier. Nous vous invitons à prendre contact avec notre service commercial.");
}
if($step == "6.4.0"){
$previousStep = "6.3.0";
$nextStep = "6.5.0";
$finalStep = true;
}
if($step == "6.5.0"){
$previousStep = "6.4.0";
$nextStep = "end";
$finalStep = true;
}
if($step == "end"){
$previousStep = "6.5.0";
$nextStep = "";
$finalStep = true;
//If no sign
/*
if(!$membership->getSignDate()){
return $this->redirectToRoute('membership_sign', ["userID" => "me", "membershipID" => $membership->getId()]);
//Redirect Yousign
}
else{
//If sign
}
*/
}
//For next
if($action == "next"){
$user->setStepSignup($nextStep);
$this->em->persist($user);
$this->em->flush($user);
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
//For previous
if($action == "previous"){
$user->setStepSignup($previousStep);
$this->em->persist($user);
$this->em->flush($user);
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
//Upadte step by recap
if($action == "getStep"){
if($step != "6.1.0"){
$this->addFlash('danger', 'Vous ne pouvez pas accéder à cette page');
return $this->redirectToRoute('member_signup', []);
}
$user->setStepSignup($stepForAction);
$this->em->persist($user);
$this->em->flush($user);
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
//$errorEnd = array("title" => "Fin de parcours", "description" => "Votre profil nécessite une étude approfondie de votre besoin. <br/>Pour se faire, merci de contacter votre conseiller au [Tel + mail du service commercial]");
}
elseif($action == "endStep0"){
$step = "0.0.end";
$previousStep = "0";
$errorEnd = array("title" => "Nous sommes navrés, seules personnes résidentes fiscalement en France peuvent souscrire", "description" => "");
}
elseif($action == "endStep0Minor"){
$step = "0.0.end.minor";
$previousStep = "0";
$errorEnd = array("title" => "Fin de parcours", "description" => "Oups...nous sommes navrés ! Vous ne pouvez pas finaliser ce parcours de souscription en ligne. Pour finaliser La souscription au contrat ".$this->utils->getProductName($productType)." pour un mineur, contactez nos conseillers.");
}
elseif($action == "endStep0Older"){
$step = "0.0.end.older";
$previousStep = "0";
$errorEnd = array("title" => "Fin de parcours", "description" => "Oups...nous sommes navrés ! Vous ne pouvez pas finaliser ce parcours de souscription en ligne. Pour finaliser La souscription au contrat ".$this->utils->getProductName($productType)." pour un majeur de plus de 70 ans, contactez nos conseillers.");
}
else{
if($this->getUser()){
$userCurrent = $this->get('security.token_storage')->getToken()->getUser();
if($this->roleService->isGranted('ROLE_CUSTOMER', $userCurrent) && $userCurrent->isIsAutoSignup()){
return $this->redirectToRoute('member_signup', array("token" => $userCurrent->getTokenSignupContinue()));
}
else{
$this->addFlash('danger', 'Vous êtes connecté sur un compte non compatbile avec la création d\'une adhésion autonome');
return $this->redirectToRoute('app_login');
}
}
$user = new User;
$form = $this->createForm(SignupUserType::class, $user, Array("validation_groups" => "update"));
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$dateDeNaissance = str_replace("/", "-", $user->getDateDeNaissance());
$user->setDateDeNaissance(new \DateTime(date("Y-m-d", strtotime($dateDeNaissance))));
if($user->isAdresseFiscaleFrance() == 0){
$user->setStepSignup("0.0.end");
}
else if($this->utils->isMinor($user->getDateDeNaissance())){
$user->setStepSignup("0.0.end.minor");
}
else if($this->utils->isSeventyOrOlder($user->getDateDeNaissance())){
$user->setStepSignup("0.0.end.older");
}
else{
if($productType == "epargne"){
$user->setStepSignup("2");
}
else{
$user->setStepSignup("1");
}
}
if($user->getStepSignup() == "0.0.end"){
if($productType == "epargne"){
return $this->redirectToRoute('member_signup_epargne', ["token" => "noToken", "action" => "endStep0"]);
}
else{
return $this->redirectToRoute('member_signup_retraite', ["token" => "noToken", "action" => "endStep0"]);
}
}
else if($user->getStepSignup() == "0.0.end.minor"){
if($productType == "epargne"){
return $this->redirectToRoute('member_signup_epargne', ["token" => "noToken", "action" => "endStep0Minor"]);
}
else{
return $this->redirectToRoute('member_signup_retraite', ["token" => "noToken", "action" => "endStep0Minor"]);
}
}
else if($user->getStepSignup() == "0.0.end.older"){
if($productType == "epargne"){
return $this->redirectToRoute('member_signup_epargne', ["token" => "noToken", "action" => "endStep0Older"]);
}
else{
return $this->redirectToRoute('member_signup_retraite', ["token" => "noToken", "action" => "endStep0Older"]);
}
}
else {
//If email exist
$userExist = $this->em
->getRepository(User::class)
->findOneBy(['email' => $user->getEmail()]);
if(!$userExist){
//Valided step 0 and create user
$token = bin2hex(random_bytes(20));
//Account
$user->setIsAutoSignup(true);
$user->setTokenSignupContinue($token);
$user->setPassword("null");
$user->setUsername($user->getEmail());
$user->setStatus("VALID");
$user->addRole('ROLE_CUSTOMER');
//Set unique ID FOLDER
$uniqueIdFolder = substr($user->getFirstName(), 0, 3)."-".date("ymdhis");
$user->setAutoSignFolderNumber($uniqueIdFolder);
//Birthday date -> LAST FUNCTION, use previous
/*
if($user->getDateDeNaissance()){
$dateDeNaissance = str_replace("/", "-", $user->getDateDeNaissance());
$user->setDateDeNaissance(new \DateTime(date("Y-m-d", strtotime($dateDeNaissance))));
} else{
$user->setDateDeNaissance(null);
}
*/
$this->em->persist($user);
$this->em->flush($user);
//add data in BA, SEPA and FIC
$membershipCurrent = $this->utils->createMembershipByProduct($user, $productType, "fullweb");
$ba = $membershipCurrent->getBa();
$fic = $membershipCurrent->getFic();
$fic->setSex($user->getSex());
$fic->setEmail($user->getEmail());
$fic->setDateDeNaissance($user->getDateDeNaissance());
$fic->setNom($user->getLastName());
$fic->setPrenom($user->getFirstName());
$fic->setAdresseFiscaleResidenceFrance(false);
$ba->setSex($user->getSex());
$ba->setEmail($user->getEmail());
$ba->setDateDeNaissance($user->getDateDeNaissance());
$ba->setNom($user->getLastName());
$ba->setPrenom($user->getFirstName());
$ba->setCodeConseiller("FWB");
$ba->setResidenceFrance(true);
$this->em->persist($ba);
$this->em->flush();
//Send mail start signup
$mailNoReply = $this->getParameter('mail_no_reply');
$senderName = $this->getParameter('sender_name');
$urlSignup = $this->get('router')->generate('member_signup', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL);
$bodyEmail = $this->renderView(
'email/startSignup.html.twig',
array('user' => $user, 'urlSignup' => $urlSignup)
);
$message = (new \Swift_Message("Demande d'adhésion"))
->setSubject("Demande d'adhésion")
->setFrom(array($mailNoReply => $senderName))
->setTo(array($user->getEmail() => $senderName))
->setBody($bodyEmail, 'text/html');
$this->mailer->send($message);
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
else{
$this->addFlash('danger', 'Une demande d\'adhésion a déjà été émise avec cette adresse email.');
}
}
}
}
$stepKey = str_replace(".", "_", $step);
return $this->render('signup/signup.html.twig', Array(
"step" => $step,
"stepKey" => $stepKey,
"productType" => $productType,
"form" => $form ? $form->createView() : null,
"errorEnd" => $errorEnd,
"token" => $token,
"user" => $user,
"ba" => $ba,
"fic" => $fic,
"membership" => $membership,
"previousStep" => $previousStep,
"nextStep" => $nextStep,
"finalStep" => $finalStep
));
}
/**
* @Route("/fullweb/re_send_mail_no_sign", name="signup_resend_mail_no_sign")
*/
public function reSendMailNoSign(Request $request){
$userCurrent = $this->get('security.token_storage')->getToken()->getUser();
if($this->roleService->isGranted('ROLE_CUSTOMER', $userCurrent) && $userCurrent->isIsAutoSignup()){
$token = $userCurrent->getTokenSignupContinue();
$membershipCurrent = $this->utils->getMembershipByCustomer($userCurrent);
$dateSendMail = $membershipCurrent->getSendMailNoSignDate();
$datetimeNow = new \DateTime('now -60 seconds');
if($datetimeNow->format("YmdHis") >= $dateSendMail->format("YmdHis")){
$this->sendMailFolder($membershipCurrent, true);
$this->addFlash('success', "Le mail vient d'être à nouveau envoyé");
}
else{
$this->addFlash('danger', "Vous avez déjà fait une demande dans les 60 dernières secondes, vous devez attendre pour réessayer");
}
return $this->redirectToRoute('member_signup', ["token" => $token]);
}
else{
$this->addFlash('danger', 'Vous êtes connecté sur un compte non compatbile avec la création d\'une adhésion autonome');
return $this->redirectToRoute('app_login');
}
}
private function sendMailFolder(Membership $membership, bool $force = false){
if($membership->isSendMailNoSign() && $force == false){
return true;
}
//BA, DIC, FIC AND SEPA
//Send mail start signup
$mailNoReply = $this->getParameter('mail_no_reply');
$senderName = $this->getParameter('sender_name');
$productType = $membership->getProduct();
$user = $membership->getUser();
$weight = 0;
$bodyEmail = $this->renderView(
'email/sendFilesNoSign_'.$membership->getProduct().'.html.twig',
array('membership' => $membership)
);
//Fic
$attachmentFic = \Swift_Attachment::fromPath($this->fileUploader->getTargetDirectory()."/".$membership->getUser()->getId()."/".$membership->getFic()->getUrlPdf(), "application/pdf")->setFilename("Non signé - Fiche d'information et de conseil.pdf");
$weight = $weight + filesize($this->fileUploader->getTargetDirectory()."/".$membership->getUser()->getId()."/".$membership->getFic()->getUrlPdf());
//Ba
$attachmentBa = \Swift_Attachment::fromPath($this->fileUploader->getTargetDirectory()."/".$membership->getUser()->getId()."/".$membership->getBa()->getUrlPdf(), "application/pdf")->setFilename("Non signé - Demande d'adhésion.pdf");
$weight = $weight + filesize($this->fileUploader->getTargetDirectory()."/".$membership->getUser()->getId()."/".$membership->getBa()->getUrlPdf());
//Sepa
$attachmentSepa = \Swift_Attachment::fromPath($this->fileUploader->getTargetDirectory()."/".$membership->getUser()->getId()."/".$membership->getBa()->getSepaUrlPdf(), "application/pdf")->setFilename("Non signé - Mandat de prélèvement SEPA.pdf");
//Status
$attachmentStatus = \Swift_Attachment::fromPath($this->fileUploader->getTargetDirectory()."/../img/Statuts_mer_2022.pdf", "application/pdf");
$weight = $weight + filesize($this->fileUploader->getTargetDirectory()."/../img/Statuts_mer_2022.pdf");
//Réglements
$attachmentReglement = \Swift_Attachment::fromPath($this->fileUploader->getTargetDirectory()."/../default/".$membership->getProduct()."/REGLEMENT.pdf", "application/pdf");
$weight = $weight + filesize($this->fileUploader->getTargetDirectory()."/../default/".$membership->getProduct()."/REGLEMENT.pdf");
//Dic
$attachmentDicPdf = \Swift_Attachment::fromPath($this->fileUploader->getTargetDirectory()."/../default/".$membership->getProduct()."/DIC.pdf", "application/pdf");
$weight = $weight + filesize($this->fileUploader->getTargetDirectory()."/../default/".$membership->getProduct()."/DIC.pdf");
if($productType == "retraite"){
//Frais
$attachmentFraisPdf = \Swift_Attachment::fromPath($this->fileUploader->getTargetDirectory()."/../default/".$membership->getProduct()."/FRAIS.pdf", "application/pdf");
$weight = $weight + filesize($this->fileUploader->getTargetDirectory()."/../default/".$membership->getProduct()."/FRAIS.pdf");
}
$message = (new \Swift_Message("Éléments précontractuels"))
->setSubject("Éléments précontractuels")
->setFrom(array($mailNoReply => $senderName))
->setTo(array($user->getEmail() => $senderName))
->setBody($bodyEmail, 'text/html')
->attach($attachmentFic)
->attach($attachmentBa)
->attach($attachmentSepa)
->attach($attachmentStatus)
->attach($attachmentReglement)
->attach($attachmentDicPdf)
;
if($productType == "retraite"){
$message->attach($attachmentFraisPdf);
}
$this->mailer->send($message);
$membership->setSendMailNoSign(true);
$membership->setSendMailNoSignDate(new \DateTime("now"));
$this->em->persist($membership);
$this->em->flush($membership);
return true;
}
}