<?php
namespace App\Controller;
use App\Entity\Campaign;
use App\Entity\Company;
use App\Entity\User;
use App\Enum\CampaignTypeInitiation;
use App\Enum\TypePack;
use App\Event\Campaign\CampaignCreatedEvent;
use App\Event\ClientUpdatedEvent;
use App\Event\DevisCreatedWithNewClientEvent;
use App\Form\DevisPublicType;
use App\Service\DynamicHostService;
use App\Repository\CompanyRepository;
use App\Repository\UserRepository;
use App\Service\DevisService;
use App\Service\NotificationService;
use App\Service\UserService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mime\Address;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\CreditHistory;
use App\Repository\CreditHistoryRepository;
use App\Service\PackService;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use App\Service\MissionService;
#[Route('', name: 'devis_')]
class DevisController extends AbstractController
{
public function __construct(
private CompanyRepository $companyRepository,
private UserRepository $userRepository,
private EntityManagerInterface $entityManager,
private EventDispatcherInterface $dispatcher,
private UserService $userService,
private UserPasswordHasherInterface $hasher,
private NotificationService $notificationService,
private DevisService $devisService,
private MissionService $missionService,
){
}
#[Route('/api/devis/', name: 'add', methods: ['POST', 'GET'])]
public function add(Request $request, ParameterBagInterface $parameter,CreditHistoryRepository $creditHistoryRepository): JsonResponse|Response
{
$campaign = new Campaign();
$form = $this->createForm(DevisPublicType::class, $campaign, ['csrf_protection' => false]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$recaptcha_response = $request->request->get('token');
$originPostDevice = $request->query->get('device');
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_secret = $parameter->get('recaptcha_secret');
$recaptcha = file_get_contents($recaptcha_url . '?secret=' . $recaptcha_secret . '&response=' . $recaptcha_response);
$recaptcha = json_decode($recaptcha);
if ($originPostDevice != 'mobil' && !($recaptcha->success && $recaptcha->score >= 0.5)){
return new JsonResponse([
'status'=> 'ko',
'stssatus'=> $originPostDevice,
'response'=> $recaptcha_response,
'recaptcha_secret'=>$recaptcha_secret,
'recaptcha_status'=>$recaptcha->success,
'recaptcha_score'=> $recaptcha->score,
'message'=> 'recaptchat invalid',
'short_code'=> 'invalid_recaptchat'
],401);
}
$campaignTypeInitiation = CampaignTypeInitiation::CAMPAIGN_FROM_DEVIS_PUBLIC->value;
$emailOrderedBy = $form->get('orderedBy')->getData();
$attachments = $request->files->get('devis_public')!=null ? $request->files->get('devis_public')['attachments'] : [];
$companyName = $form->get('company')->getData();
$userPersisted = $this->userRepository->findOneBy(['email'=>$emailOrderedBy]);
if($userPersisted != null){
$userRoleToUbleCreateACampaign = !(in_array('ROLE_SUBCONTRACTOR', $userPersisted->getRoles()) OR in_array('ROLE_ADMIN', $userPersisted->getRoles()));
if($userRoleToUbleCreateACampaign){
$companyPersisted = $userPersisted->getCompany();
$company = is_null($companyPersisted) ? $this->devisService->createCompany($userPersisted, $companyName) : $companyPersisted ;
$campaign->setCompany($company)
->setDefaultValidator([$userPersisted->getOriginalMailUser()])
->setTypeInitiation($campaignTypeInitiation)
->setOrderedBy($userPersisted);
;
$creditHistory = $creditHistoryRepository->findBy(['company'=>$company,'typePack' => '4']);
if (empty($creditHistory)) {
$creditHistory = $creditHistoryRepository->findBy(['company'=>$company])[0];
}else{
$creditHistory = $creditHistory[0];
}
$campaign->setCreditHistory($creditHistory);
$event = new CampaignCreatedEvent($campaign, 'CREATION_DEVIS_PUBLIC');
$this->dispatcher->dispatch($event, CampaignCreatedEvent::NAME);
$this->entityManager->persist($campaign);
$this->entityManager->flush();
$this->devisService->addAttachements($campaign,$attachments);
foreach ($campaign->getMissions() as $mission) {
$this->missionService->addHistorique(mission: $mission, user:$campaign->getOrderedBy() , action: "devis_public");
}
return new JsonResponse([
'status'=>'ok',
'message'=> 'create with success',
'is_new_user'=> false,
'short_code'=> 'create_with_success'
],201);
}
return new JsonResponse([
'status'=>'ko',
'message'=> 'not allowed to create devis',
'short_code'=> 'unable_to_create_devis'
],401);
}
else {
$company = $this->companyRepository->findOneBy(['name'=>$companyName]);
$password = $this->userService->generatePassword();
$user = new User();
$hashedPassword = $this->hasher->hashPassword($user, $password);
$user->setPassword($hashedPassword)
->setRoles(['ROLE_CLIENT'])
->setEmail($emailOrderedBy)
->setCellPhone($form->get('phoneNumber')->getData())
->setEnabled(false)
->setState('enabled')
;
$this->entityManager->persist($user);
$this->entityManager->flush();
$event = new ClientUpdatedEvent($user, true);
$this->dispatcher->dispatch($event, ClientUpdatedEvent::NAME);
$company = is_null($company) ? $this->devisService->createCompany($user, $companyName) : $company ;
$campaign->setCompany($company)
->setDefaultValidator([$user->getOriginalMailUser()])
->setTypeInitiation($campaignTypeInitiation)
->setOrderedBy($user);
$creditHistory = $creditHistoryRepository->findBy(['company'=>$company,'typePack' => '4']);
if (empty($creditHistory)) {
$creditHistory = $creditHistoryRepository->findBy(['company'=>$company])[0];
}else{
$creditHistory = $creditHistory[0];
}
$campaign->setCreditHistory($creditHistory);
$user->setCompany($company);
$this->entityManager->persist($campaign);
$this->entityManager->flush();
$linkAttachments= $this->devisService->addAttachements($campaign,$attachments);
$event = new CampaignCreatedEvent($campaign, 'CREATION_DEVIS_PUBLIC', [], false, $linkAttachments, false, true);
$this->dispatcher->dispatch($event, CampaignCreatedEvent::NAME);
// $event = new DevisCreatedWithNewClientEvent($campaign, $linkAttachments);
// $this->dispatcher->dispatch($event, DevisCreatedWithNewClientEvent::NAME);
$user->setDeleted(false);
$this->entityManager->flush();
foreach ($campaign->getMissions() as $mission) {
$this->missionService->addHistorique(mission: $mission, user:$campaign->getOrderedBy() , action: "devis_public");
}
}
return new JsonResponse([
'status'=>'ok',
'message'=> 'create with success',
'is_new_user'=> true,
'short_code'=> 'create_with_success']);
}
// return new JsonResponse([
// 'status'=>'ko',
// 'message'=> 'not allowed to create devis',
// 'short_code'=> 'unable_to_create_devis'
// ], 401);
return $this->render('devis/index.html.twig',[
'form'=>$form->createView()
]);
}
#[Route('/creation/devis', name: 'create_devis_public_agence', methods: ['POST', 'GET'])]
public function create(Request $request, ParameterBagInterface $parameter,CreditHistoryRepository $creditHistoryRepository,DynamicHostService $host): JsonResponse|Response
{
$companyAgency = $host->getCompany();
//redirection si MYFlow
if ($companyAgency == null) {
return $this->redirectToRoute('app_login');
}
//fin redirection
$campaign = new Campaign();
$form = $this->createForm(DevisPublicType::class, $campaign, ['csrf_protection' => false]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$campaignTypeInitiation = CampaignTypeInitiation::CAMPAIGN_FROM_DEVIS_PUBLIC->value;
$emailOrderedBy = $form->get('orderedBy')->getData();
$attachments = $request->files->get('devis_public')!=null ? $request->files->get('devis_public')['attachments'] : [];
$companyName = $form->get('company')->getData();
$userPersisted = $this->userRepository->getUserByCompanyForAgency($emailOrderedBy,$companyAgency);
$userMyFlow = $this->userRepository->getUserMyFlow($emailOrderedBy);
if (is_null($userPersisted) and !is_null($userMyFlow)) {
return $this->redirectToRoute('devis_failed_devis_public_agency', ['id' => $companyAgency->getId()]);
}
if($userPersisted != null){
$userRoleToUbleCreateACampaign = !(in_array('ROLE_SUBCONTRACTOR', $userPersisted->getRoles()) OR in_array('ROLE_ADMIN', $userPersisted->getRoles()));
if($userRoleToUbleCreateACampaign){
$companyPersisted = $userPersisted->getCompany();
if (!is_null($companyName) and !empty($companyName) and is_null($userPersisted?->getCompany())) {
$company = $this->devisService->createCompanyAgency($userPersisted, $companyName,$companyAgency) ;
}else{
$company = $userPersisted?->getCompany() ?? $companyAgency;
}
$campaign->setCompany($company)
->setDefaultValidator([$userPersisted->getOriginalMailUser()])
->setTypeInitiation($campaignTypeInitiation)
->setOrderedBy($userPersisted);
;
$creditHistory = $creditHistoryRepository->findBy(['company'=>$company,'typePack' => '4']);
if (empty($creditHistory)) {
$creditHistory = $creditHistoryRepository->findBy(['company'=>$company])[0];
}else{
$creditHistory = $creditHistory[0];
}
$campaign->setCreditHistory($creditHistory);
$event = new CampaignCreatedEvent($campaign, 'CREATION_DEVIS_PUBLIC');
$this->dispatcher->dispatch($event, CampaignCreatedEvent::NAME);
$this->entityManager->persist($campaign);
$this->entityManager->flush();
$this->devisService->addAttachements($campaign,$attachments);
foreach ($campaign->getMissions() as $mission) {
$this->missionService->addHistorique(mission: $mission, user:$campaign->getOrderedBy() , action: "devis_public");
}
return $this->redirectToRoute('devis_confirmation_devis_public_agency', ['id' => $companyAgency->getId()]);
}
return $this->redirectToRoute('devis_failed_devis_public_agency', ['id' => $companyAgency->getId()]);
}
else {
$company = $this->companyRepository->findOneBy(['name'=>$companyName]);
$password = $this->userService->generatePassword();
$userMyFlow = $this->userRepository->getUserMyFlow($emailOrderedBy);
if ($userMyFlow != null) {
return $this->redirectToRoute('devis_failed_devis_public_agency', ['id' => $companyAgency->getId()]);
}
$user = new User();
$hashedPassword = $this->hasher->hashPassword($user, $password);
$user->setPassword($hashedPassword)
->setRoles(['ROLE_CLIENT'])
->setEmail($emailOrderedBy)
->setCellPhone($form->get('phoneNumber')->getData())
->setEnabled(false)
->setIsNewClient(false)
->setState('enabled')
;
$this->entityManager->persist($user);
$this->entityManager->flush();
$event = new ClientUpdatedEvent($user, true);
$this->dispatcher->dispatch($event, ClientUpdatedEvent::NAME);
if (!is_null($companyName) and !empty($companyName)) {
//verification si company MyFlow,Alors faire la création
if (!is_null($company) and $company?->getTypeCompany() == null and $company?->getParent() == null) {
$company = $this->devisService->createCompanyAgency($user, $companyName,$companyAgency);
}else{
$company = is_null($company) ? $this->devisService->createCompanyAgency($user, $companyName,$companyAgency) : $company ;
}
}else{
$company = $companyAgency;
}
$campaign->setCompany($company)
->setDefaultValidator([$user->getOriginalMailUser()])
->setTypeInitiation($campaignTypeInitiation)
->setOrderedBy($user);
$creditHistory = $creditHistoryRepository->findBy(['company'=>$company,'typePack' => '4']);
if (empty($creditHistory)) {
$creditHistory = $creditHistoryRepository->findBy(['company'=>$company])[0];
}else{
$creditHistory = $creditHistory[0];
}
$campaign->setCreditHistory($creditHistory);
$user->setCompany($company);
$this->entityManager->persist($campaign);
$this->entityManager->flush();
$linkAttachments= $this->devisService->addAttachements($campaign,$attachments);
$event = new CampaignCreatedEvent($campaign, 'CREATION_DEVIS_PUBLIC', [], false, $linkAttachments, false, true);
$this->dispatcher->dispatch($event, CampaignCreatedEvent::NAME);
$event = new DevisCreatedWithNewClientEvent($campaign, $linkAttachments);
$this->dispatcher->dispatch($event, DevisCreatedWithNewClientEvent::NAME);
$user->setDeleted(false);
$this->entityManager->flush();
foreach ($campaign->getMissions() as $mission) {
$this->missionService->addHistorique(mission: $mission, user:$campaign->getOrderedBy() , action: "devis_public");
}
return $this->redirectToRoute('devis_confirmation_devis_public_agency', ['id' => $companyAgency->getId()]);
}
}
return $this->render('inscription/devis_public.html.twig',[
'form'=>$form->createView(),
'company' => $companyAgency
]);
}
#[Route('/confirmation/devis/{id}', name: 'confirmation_devis_public_agency', methods: ['POST', 'GET'])]
public function confirmation(Company $company):Response
{
return $this->render('inscription/confirmation_devis.html.twig', [
'company' => $company
]);
}
#[Route('/failed/devis/{id}', name: 'failed_devis_public_agency', methods: ['POST', 'GET'])]
public function failed(Company $company):Response
{
return $this->render('inscription/failed_devis.html.twig', [
'company' => $company
]);
}
}