<?php
namespace App\Controller;
use App\Service\AssociatedMailUserService;
use App\Entity\Service;
use App\Entity\SignedContract;
use App\Entity\SubContractorCompany;
use App\Entity\SystemEmail;
use App\Entity\UserData;
use App\Enum\TypeSignedContract;
use App\Event\ClientUpdatedEvent;
use App\Entity\User;
use App\Enum\ProductType;
use App\Entity\NoteUser;
use App\Enum\Role;
use App\Event\AdminNotifiedSubContractorCompletedEvent;
use App\Event\SubContractor\SubContractorCompletedProfileEvent;
use App\Event\SubContractor\SubContractorServiceAddedEvent;
use App\Event\SubContractor\SubContractorMarginProblemEvent;
use App\Event\SubContractorUpdatedEvent;
use App\Event\SubContractor\SubContractorActivatedEvent;
use App\Event\SubContractorVigilanceCertificateAbsentEvent;
use App\Service\ConfidentialityService;
use App\Service\PdfService;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use App\Form\SubContractorCompanyType;
use App\Form\SubContractorType;
use App\Form\NewSubContractorType;
use App\Service\MyFlowMarginService;
use App\Form\ServiceType;
use App\Repository\CampaignRepository;
use App\Repository\HistoriqueRepository;
use App\Repository\JobRepository;
use App\Repository\MessageRepository;
use App\Repository\MissionParticipantRepository;
use App\Repository\ProductRepository;
use App\Repository\ServiceRepository;
use App\Repository\SubContractorCompanyRepository;
use App\Repository\CompanyRepository;
use App\Repository\SystemEmailRepository;
use App\Repository\UserRepository;
use App\Repository\MissionRepository;
use App\Repository\PortfolioRepository;
use App\Service\ServiceService;
use App\Service\ShortcodeService;
use App\Service\UserService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\NotificationEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\SerializerInterface;
use App\Service\NumberFormatService;
use App\Service\PortfolioSevice;
use Twig\Environment;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\HttpFoundation\StreamedResponse;
use App\Entity\Company;
use App\Service\DynamicHostService;
use App\Form\NoteUserType;
use App\Enum\Note;
class SubContractorController extends AbstractController
{
public function __construct(
private NumberFormatService $numberFormatService,
private EventDispatcherInterface $dispatcher,
private Environment $twig,
private ConfidentialityService $confidentialityService,
)
{
}
/**
* @param UserRepository $userRepository
* @return Response
*/
#[Route('/admin/fournisseurs', name: 'sub_contractor_index', methods: ['GET'])]
public function index(UserRepository $userRepository): Response
{
$roleBot = Role::ROLE_BOT->value;
$roleSub = Role::ROLE_SUBCONTRACTOR->value;
$company = $this->isGranted('ROLE_ADMIN_AGENCY') ? $this->getUser()->getCompany() : null;
return $this->render('sub_contractor/index.html.twig', [
'subContractors' => $userRepository->findByRoleBotAndSubcontractorOrManager($roleBot,$roleSub,$company),
'company' => $company,
'min_price' => "",
'max_price' => "",
]);
}
/**
* @param User|null $user
* @param Service|null $service
* @param Request $request
* @param UserService $userService
* @param UserPasswordHasherInterface $hasher
* @param ServiceRepository $serviceRepository
* @param EntityManagerInterface $entityManager
* @return Response
*/
#[Route('/admin/fournisseurs/ajouter', name: 'sub_contractor_new', methods: ['GET','POST'])]
#[Route('/admin/fournisseurs/{id}', name: 'sub_contractor_edit', methods: ['GET','POST'])]
#[Route('/mon-profil', name: 'my_profil', methods: ['GET','POST'])]
public function handleSubContractor(User $user = null,ConfidentialityService $confidentialityService, PortfolioRepository $portfolioRepository, PortfolioSevice $portflioSevice, Service $service = null, Request $request, UserService $userService, UserPasswordHasherInterface $hasher, ServiceRepository $serviceRepository, EntityManagerInterface $entityManager, EventDispatcherInterface $dispatcher, ServiceService $serviceService, SystemEmailRepository $systemEmailRepository, ShortcodeService $shortcodeService, MailerInterface $mailer, ProductRepository $productRepository,MyFlowMarginService $myFlowMarginService, ParameterBagInterface $parameter,CompanyRepository $companyRepository,DynamicHostService $dynamicHostService,UserRepository $userRepository,AssociatedMailUserService $associatedMailUserService): Response
{
$currentUser = $this->getUser();
$isNew = false;
if($request->request->get('remove-my-account')!=null){
return $this->redirectToRoute('my_profil',[
'confirm_account_deleted'=> true,
]);
}
$oldPrice = null;
if ($user === null && $this->isGranted('ROLE_ADMIN')){
$user = new User();
if ($this->isGranted('ROLE_ADMIN_AGENCY')) {
$user->setCompany($this->getUser()->getCompany());
}
$servicesSubContractor = null;
$isNew = true;
}elseif ($this->isGranted('ROLE_ADMIN')){
$servicesSubContractor = $serviceRepository->findBy(['user' => $user->getId(),'template'=>true]);
}else{
$user = $this->getUser();
$oldPrice = $user->getDailyRate();
$servicesSubContractor = $serviceRepository->findBy(['user' => $user->getId(),'template'=>true]);
}
$currentRoute = $request->attributes->get('_route');
$isadminAgency = false;
$isManager = false;
if (in_array("ROLE_ADMIN_AGENCY", $this->getUser()->getRoles())) {
$isadminAgency = true;
}
if (in_array("ROLE_MANAGER", $this->getUser()->getRoles())) {
$isManager = true;
}
if ($user === null){
$typeAction = 'new';
$user = new User();
if (in_array("ROLE_ADMIN_AGENCY", $this->getUser()->getRoles())) {
$user->setCompany($this->getUser()->getCompany());
$isadminAgency = true;
}
}
$manager = null;
$managerOrigin = null;
$partner = null;
$partnerOrigin = null;
$salary = null;
$salaryOrigin = null;
if ($request->attributes->get('_route') == 'sub_contractor_edit') {
//Detect if user in children
foreach ($user->getChildren() as $userChild) {
if (in_array('ROLE_MANAGER', $userChild->getRoles()) ) {
$manager = true;
}
}
}
$originalUser = clone($user);
$otherCompanyOrigin = $originalUser->getOtherCompany();
foreach ($otherCompanyOrigin as $key => $c) {
$user->addOtherCompany($c);
}
//dd($otherCompanyOrigin);
$company = $dynamicHostService->getCompany();
$oldDailyRate = $user->getDailyRate();
$form = $this->createForm(SubContractorType::class, $user, [
'admin' => $this->isGranted('ROLE_ADMIN'),
'subcontractor' => $this->isGranted('ROLE_SUBCONTRACTOR'),
'isadminAgency'=>$isadminAgency,'isManager'=>$isManager,
'manager'=>$manager,
'partner'=>$partner,
'salary'=>$salary,
'currentRoute'=>$request->attributes->get('_route'),
'mail_alias_default' => implode(',', $user->getMailAlias() ?? []),
]);
$entityManager = $this->getDoctrine()->getManager();
$form->handleRequest($request);
$allUserFile = [];
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
//when subcontractor manually modify the dailyRate , automatically change the resaleRate with the ratio kept
if ($data->getDailyRate() != $oldDailyRate && $this->isGranted('ROLE_SUBCONTRACTOR')) {
$resaleRateWithRatios = $userService->resaleRateWithRatio($oldDailyRate,$data->getResaleRate(),$data->getDailyRate());
$data->setResaleRate($resaleRateWithRatios);
}
//
$dataInMapped = $request->request->all();
$notePrivate = $dataInMapped['note_user_private']['content'] ?? null;
if (!is_null($notePrivate) and !empty($notePrivate) ) {
$newNote = new NoteUser();
$newNote->setContent($notePrivate);
$newNote->setCreatedAt(new \DateTime());
$newNote->setUserToCommented($this->getUser());
$newNote->setType(Note::NOTE_PRIVATE->value);
$entityManager->persist($newNote);
$entityManager->flush();
$data->addNoteUser($newNote);
}
$emailsString = $form->get('mailAliasOtherForm')->getData(); // Champ non mappé
if (!is_null($emailsString) and !empty($emailsString)) {
$emailsArray = array_map('trim', explode(',', $emailsString));
if (is_array($emailsArray) and !empty($emailsString)) {
$data->setMailAlias($emailsArray);
}
}
//verirify if user already exist
$userExistInSameDomaine = $userRepository->getUniqUserByCompanyByEmailForSubClientManager($user->getEmail(),$company);
if (!is_null($userExistInSameDomaine) and $request->get('_route') === 'sub_contractor_new') {
$this->addFlash('error', "L'utilisateur que vous tentez de créer existe déjà.");
return $this->redirectToRoute('sub_contractor_new', [], Response::HTTP_SEE_OTHER);
}
$userExist = $entityManager->getRepository(User::class)->findOneBy(['email'=>$user->getEmail()]);
//si pas de selection donc il faut mettre partener par defaut
if (!$data->getPartner() and !$data->getSalary() and !$data->getManager()) {
$form->getData()->setPartner(1);
}
$newPrice = $form->getData()->getDailyRate();
$isBot = isset($request->request->all()['sub_contractor']['bot']) ? true: false;
//determine a ROLE
$isManager = false;
if ($data->getManager()) {
$roles = [Role::ROLE_MANAGER->value];
$isManager = true;
}else{
$roles = ($isBot) ? [Role::ROLE_BOT->value] : [Role::ROLE_SUBCONTRACTOR->value];
}
//end detection ROLE
$path = "file_user_directory";
$file = $form['userData']['VigilanceCertificateFile']->getData();
if (!is_null($file)) {
$destination = $parameter->get($path);
if (!is_dir($destination)) {
mkdir($destination, 0755, true);
}
$originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$newFilename = $originalFilename . '-' . uniqid() . '.' . $file->guessExtension();
$file->move(
$destination,
$newFilename
);
//save file vigilence in data (name of file / date insertion)
$allUserFile = $user->getUserData()->getVigilanceCertificate();
$allUserFile [] = [
'name' => $newFilename,
'shortName' => mb_substr($newFilename, 0, 40)."...",
'dateInsert' => new \Datetime()
];
if($user->getUserData()->getStateCompany() === 'fr'){
$this->updateUserDataDateCertificate($user->getUserData());
$user->getUserData()->setVigilanceCertificate($allUserFile);
}
}
//inject other company
$companyForManager = $form->getData()->getOtherCompany();
if ($form->getData()->getAllCompany() == true) {
$companyForManager = $entityManager->getRepository(Company::class)->getAllCompanyMyFlowOrAgency($dynamicHostService);
}
foreach ($companyForManager as $company) {
$user->addOtherCompany($company);
$entityManager->persist($user);
}
if ($request->get('_route') === 'sub_contractor_new') {
//si pas de notification par chat tout les jours alors mettre par défaut.
$freqNotificationEverytime = $form->getData()->getFreqNotificationEverytime();
if(!in_array("0", $freqNotificationEverytime)){
$freqNotificationEverytime[] = 0;
$form->getData()->setFreqNotificationEverytime($freqNotificationEverytime);
}
}
//si parent existe il faut creez l'enfant donc avec le company
if ($request->get('_route') === 'sub_contractor_new' and !is_null($userExist)) {
$company = $currentUser?->getCompany();
$user->setCompany($company)->setRoles($roles);
$userExist->addChild($user);
$notification = true;
$entityManager->flush();
if ($isManager) {
$this->addFlash('success', 'Le gestionnaire a bien été ajouté');
}else{
$this->addFlash('success', 'L\'intervenant opérationnel a bien été ajouté');
}
}//sinon faire
else if ($request->get('_route') === 'sub_contractor_new' and is_null($userExist)) {
if (!empty($form->getData()->getPlainPassword())){
$hashedPassword = $hasher->hashPassword($user, $form->getData()->getPlainPassword());
}else{
$password = $userService->generatePassword();
$hashedPassword = $hasher->hashPassword($user, $password);
}
$user->setBillingMethod(2);
$user->setPassword($hashedPassword)
->setRoles($roles)
->setEnabled(false);
$entityManager->persist($user);
if ($isManager) {
$this->addFlash('success', 'Le gestionnaire a bien été ajouté');
}else{
$this->addFlash('success', 'L\'intervenant opérationnel a bien été ajouté');
}
$notification = true;
$entityManager->flush();
} else {
if (!empty($form->getData()->getPlainPassword())){
$hashedPassword = $hasher->hashPassword($user, $form->getData()->getPlainPassword());
$user->setPassword($hashedPassword);
}
$user->setRoles($roles);
if ($isManager) {
$this->addFlash('success', 'Le gestionnaire a bien été modifié');
}else{
$this->addFlash('success', "L'utilisateur a bien été modifié");
}
$notification = false;
if (!empty($oldPrice) && $oldPrice != $newPrice && $this->isGranted('ROLE_SUBCONTRACTOR')) {
$user->setResaleRate($myFlowMarginService->recalculateResaleRate($oldPrice,$user, $originalUser));
}
$entityManager->flush();
}
$user->setPicture(null);
// dispatch the subonctractor.updated event
if ($request->get('_route') === 'sub_contractor_new' and $isManager) {
// dispatch the manager event
$event = new ClientUpdatedEvent($user, $notification);
$dispatcher->dispatch($event, ClientUpdatedEvent::NAME);
}else{
// dispatch the subonctractor.updated event
$event = new SubContractorUpdatedEvent($user, $notification, false, false);
$dispatcher->dispatch($event, SubContractorUpdatedEvent::NAME);
}
$confidentialityService->renegereSignedContract($user);
if ($this->isGranted('ROLE_ADMIN')){
return $this->redirectToRoute('sub_contractor_edit', ['id' => $user->getId()], Response::HTTP_SEE_OTHER);
}else{
//$event = new AdminNotifiedSubContractorCompletedEvent($user);
//$dispatcher->dispatch($event, AdminNotifiedSubContractorCompletedEvent::NAME);
return $this->redirectToRoute('mission_index', []);
}
}
$form2 = $this->createForm(ServiceType::class, new Service, ['admin' => $this->isGranted('ROLE_ADMIN'), 'subContractor' => $user] );
$form2->handleRequest($request);
if ($form2->isSubmitted() && $form2->isValid()){
$serviceId = $request->request->get('service')['serviceId'];
$findService = $serviceRepository->findOneBy(['id' => $serviceId]);
$servicesPerUser = $serviceRepository->findAllServiceByUser($user);
$findProduct = $productRepository->findOneBy(['id' => $form2->getData()->getProduct()->getId()]);
if (empty($findService)) {
$service = new Service();
$service->setTemplate(1);
$service->setPrice($form2->getData()->getPrice())
->setProduct($form2->getData()->getProduct())
->setResale($findProduct->getPrice())
->setUser($user);
foreach ($servicesPerUser as $serviceUser){
if ($serviceUser->getProduct() === $form2->getData()->getProduct()) {
$this->addFlash('error', 'Le service existe déjà pour cet utilisateur');
if ($this->isGranted('ROLE_ADMIN')){
return $this->redirectToRoute('sub_contractor_edit', [
'id' => $user->getId(),
'serviceAdd' => true,
], Response::HTTP_SEE_OTHER);
}else{
return $this->redirectToRoute('my_profil', ['serviceAdd' => true], Response::HTTP_SEE_OTHER);
}
}
}
if ($user->getBillingMethod() == 2){
$event = new SubContractorServiceAddedEvent($user);
$dispatcher->dispatch($event, SubContractorServiceAddedEvent::NAME);
}
$this->addFlash('success', 'Le produit a bien été associé');
} else {
$service = $findService;
foreach ($servicesPerUser as $serviceUser) {
if ($serviceUser->getProduct() !== $service->getProduct() && $serviceUser->getProduct() === $form2->getData()->getProduct()) {
$this->addFlash('error', 'Le service existe déjà pour cet utilisateur');
if ($this->isGranted('ROLE_ADMIN')){
return $this->redirectToRoute('sub_contractor_edit', [
'id' => $user->getId(),
'serviceAdd' => true,
], Response::HTTP_SEE_OTHER);
}else{
return $this->redirectToRoute('my_profil', ['serviceAdd' => true], Response::HTTP_SEE_OTHER);
}
}
}
$service->setPrice($form2->getData()->getPrice())
->setProduct($form2->getData()->getProduct())
->setResale($findProduct->getPrice())
->setUser($user);
$this->addFlash('success', 'Le service a bien été modifié');
}
$entityManager->persist($service);
$entityManager->flush();
$this->checkMarge($myFlowMarginService,$entityManager,$user,$service,null);
if ($this->isGranted('ROLE_ADMIN')){
return $this->redirectToRoute('sub_contractor_edit', [
'id' => $user->getId(),
'serviceAdd' => true,
], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('my_profil', ['serviceAdd' => true], Response::HTTP_SEE_OTHER);
}
}
$handleCompanyJobsForm = $this->createForm(SubContractorCompanyType::class);
$portfolios = $portfolioRepository->findBy(['user'=>$user]);
return $this->renderForm('sub_contractor/handle.html.twig', [
'form' => $form,
'form2' => $form2,
'user' => $user,
'servicesSubContractor' => $servicesSubContractor,
'service' => $this->getUser(),
'handleCompanyJobsForm' => $handleCompanyJobsForm,
'isNew' => $isNew,
'portfolioCategory' => $portflioSevice->getPorfolioCategory(),
'portfolios'=> $portfolios,
'profil_link'=> "{$parameter->get('front_website_url')}/detail-expert/?id={$user->getId()}&full-name={$user->getFullName()}"
]);
}
public function checkMarge(MyFlowMarginService $myFlowMarginService,EntityManagerInterface $entityManager,$user,$service = null,$type = "TJM"){
$subContractorCompanys = $user->getSubContractorCompanies();
$chekMailisToSend = false;
foreach ($subContractorCompanys as $subContractorCompany){
$company = $subContractorCompany->getCompany();
$userCompany = $subContractorCompany->getUser();
if ($type == "TJM") {
$currentMarge = $this->numberFormatService->format($myFlowMarginService->getMargeTJM($user));
$content = "L'intervenant opérationnel {$user->getLastname()} {$user->getFirstname()} a modifié son Tarif journalier en {$user->getDailyRate()} € ,pour cela il a été détaché de l'entreprise {$company->getName()}.
Nouveau TJM de l'intervenant opérationnel : {$user->getDailyRate()} €
Marge pas respectez : $currentMarge %
";
}else{
$currentMarge = $this->numberFormatService->format($myFlowMarginService->getMarge($service, $company));
$content = "L'intervenant opérationnel {$user->getLastname()} {$user->getFirstname()} a modifié son prix pour le produit {$service->getProduct()->getName()} ,pour cela il a été détaché de l'entreprise {$company->getName()}.
Nouveau prix pour le produit: {$service->getProduct()->getPrice()} €
Marge pas respectez : $currentMarge %
";
}
if ($currentMarge < 30 && $userCompany->getId() == $this->getUser()->getId()){
$entityManager->remove($subContractorCompany);
$entityManager->flush();
$chekMailisToSend = true;
}
}
//send mail
if ($chekMailisToSend) {
$event = new subContractorMarginProblemEvent($user,$content);
$this->dispatcher->dispatch($event, subContractorMarginProblemEvent::NAME);
}
}
/**
* @param Service $service
* @param Request $request
* @param EntityManagerInterface $entityManager
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
#[Route('/service/{id}/supprimer', name: 'service_remove', methods: ['GET','POST'])]
public function deleteService(Service $service, Request $request, EntityManagerInterface $entityManager)
{
if ($this->isCsrfTokenValid('delete'.$service->getId(), $request->request->get('_token'))) {
$entityManager->remove($service);
$entityManager->flush();
$this->addFlash(
'success',
'Le service a bien été supprimé'
);
}
if ($this->isGranted('ROLE_ADMIN')) {
return $this->redirectToRoute('sub_contractor_edit', [
'id' => $service->getUser()->getId(),
'serviceAdd' => true,
], Response::HTTP_SEE_OTHER);
} else {
return $this->redirectToRoute('my_profil', ['serviceAdd' => true], Response::HTTP_SEE_OTHER);
}
}
/**
* @param Service $service
* @param SerializerInterface $serializer
* @return JsonResponse
*/
#[Route('/service/{id}', name: 'service_action_get')]
public function getService(Service $service, SerializerInterface $serializer): JsonResponse
{
return new JsonResponse([
'service' => json_decode($serializer->serialize($service, 'json', [
AbstractNormalizer::ATTRIBUTES => [
'id',
'price',
'product' => [
'id','name'
],
'resale',
]
])),
]);
}
#[Route('/api/subcontractors/{id}', name: 'api_edit_subcontractor', methods: ['POST'])]
public function apiEditClient($id, Request $request,PdfService $pdfService, UserPasswordHasherInterface $passwordHasher, EntityManagerInterface $entityManager, EventDispatcherInterface $dispatcher, JobRepository $jobRepository, ProductRepository $productRepository,UserRepository $userRepository,UserService $userService): JsonResponse
{
if ($id == "null") {
$user = new User;
$user->setUserData(null);
$userCheck = $userRepository->findByEmail($request->request->get('email'));
if (!empty($userCheck)) {
//verification si deja existant
return new JsonResponse(['result' => 'alreadyexist']);
}
$user->setEmail($request->request->get('email'));
$user->setRoles(['ROLE_SUBCONTRACTOR']);
$user->setPartner(true);
$oldDailyRate = 0;
}else{
$user = $userRepository->find($id);
$oldDailyRate = $user->getDailyRate();
}
$user->setFirstname($request->request->get('firstname'));
$user->setLastname($request->request->get('lastname'));
//$user->setEmail($request->request->get('email'));
$user->setCellPhone($request->request->get('cellPhone'));
$user->setEnabled(true);
$user->setGender($request->request->get('gender'));
$hashedPassword = $passwordHasher->hashPassword($user, $request->request->get('password'));
$user->setPassword($hashedPassword);
$dailyRate = empty($request->request->get('dailyRate')) ? 0 : $request->request->get('dailyRate');
$user->setDailyRate($dailyRate);
if (($user->getResaleRate() == null or $user->getResaleRate() == 0) or $oldDailyRate == 0) {
$resaleRate = $dailyRate + ($dailyRate * 0.3);
}else{
$resaleRate = $userService->resaleRateWithRatio($oldDailyRate,$user->getResaleRate(),$user->getDailyRate());
}
$user->setResaleRate($resaleRate);
$jobsUser = $user->getJobs();
foreach ($jobsUser as $value) {
$user->removeJob($value);
}
if (!empty($request->request->get('jobs'))) {
foreach ($request->request->get('jobs') as $job) {
$job = $jobRepository->find($job);
if (null !== $job) {
$user->addJob($job);
}
}
}
$prices = $request->request->get('prices');
if($prices!= null){
foreach ($prices as $productId => $price) {
$product = $productRepository->findOneBy(['frontId' => $productId]);
if (null !== $product) {
$s = (new Service())
->setUser($user)
->setProduct($product)
->setPrice($price)
->setTemplate(1)
;
if ($product->getType() === ProductType::AU_FORFAIT) {
$s->setResale($product->getPrice());
}
$entityManager->persist($s);
}
}
}
$status = $request->request->get('status');
$tva = $request->request->get('tva');
$siren = !empty($request->request->get('numero_de_siren')) ?$request->request->get('numero_de_siren') : null;
$city = !empty($request->request->get('city')) ? $request->request->get('city') : null;
$adresse = !empty($request->request->get('adresse')) ?$request->request->get('adresse') : null;
$country = !empty($request->request->get('pays')) ?$request->request->get('pays') : null;
$rib = !empty($request->request->get('rib')) ?$request->request->get('rib') : null;
$iban = !empty($request->request->get('IBAN')) ?$request->request->get('IBAN') : null;
$bic_swift = !empty($request->request->get('bic_swift')) ?$request->request->get('bic_swift') : null;
$tva_entreprise = !empty($request->request->get('tva_entreprise')) ?$request->request->get('tva_entreprise') : null;
$companyName = !empty($request->request->get('companyName')) ?$request->request->get('companyName') : "";
$paysEntreprise = !empty($request->request->get('pays_entreprise')) ? $request->request->get('pays_entreprise') : null;
$language = !empty($request->request->get('langues_parlees')) ? explode(",",rtrim($request->request->get('langues_parlees'),',')) : [];
$allLanguages = [];
if (!is_null($language) and !empty($language)) {
foreach ($language as $key => $value) {
if (!empty($value)) {
$allLanguages [] = $value;
}
}
}
//add new ifnformations
if( $user->getUserData() == null){
$userData = new UserData();
$user->setUserData($userData);
}
$user->getUserData()->setStatus($status);
$user->getUserData()->setTva($tva);
$user->getUserData()->setCity($city);
$user->getUserData()->setSiren($siren);
$user->getUserData()->setAddress($adresse);
$user->getUserData()->setCountry($country);
$user->getUserData()->setSpokenLanguages($allLanguages);
$user->getUserData()->setRIB($rib);
$user->getUserData()->setIBAN($iban);
$user->getUserData()->setBicSwift($bic_swift);
$user->getUserData()->setIntracommunityTva($tva_entreprise);
$user->getUserData()->setCompanyName($companyName);
$user->getUserData()->setStateCompany($paysEntreprise);
//end
mail("sdfsdfsfdsdfsdffff@yopmail.com", "subject", "0");
$entityManager->flush();
mail("sdfsdfsfdsdfsdffff@yopmail.com", "subject", "1");
$event = new SubContractorCompletedProfileEvent($user, true, true);
$dispatcher->dispatch($event, SubContractorCompletedProfileEvent::NAME);
mail("sdfsdfsfdsdfsdffff@yopmail.com", "subject", "1");
$event = new SubContractorUpdatedEvent($user, false, true, false);
$dispatcher->dispatch($event, SubContractorUpdatedEvent::NAME);
$this->confidentialityService->addSignedContractSubcontractor($user, true, true, true);
return new JsonResponse(['result' => 'success']);
}
#[Route('/api/subcontractors/{email}/profile-picture', name: 'api_edit_subcontractor_profile_picture', methods: ['POST'])]
public function apiEditClientProfilePicture($email, Request $request, EntityManagerInterface $entityManager,ParameterBagInterface $parameter,EventDispatcherInterface $dispatcher,CampaignRepository $campaignRepository,UserRepository $userRepository): JsonResponse
{
$userByEmail = $userRepository->findByEmail($email);
$user = $userByEmail[0];
if (!empty($request->files->get('picture'))) {
$user->setPicture($request->files->get('picture'));
}
if (!empty($request->files->get('vigilence'))) {
$file = $request->files->get('vigilence');
//insertion picture vigilence
$path = "file_user_directory";
$allUserFile = [];
if (!is_null($file)) {
try{
$destination = $parameter->get($path);
if (!is_dir($destination)) {
mkdir($destination, 0755, true);
}
$originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$newFilename = $originalFilename . '-' . uniqid() . '.' . $file->guessExtension();
$file->move(
$destination,
$newFilename
);
//save file vigilence in data (name of file / date insertion)
$allUserFile = $user->getUserData()->getVigilanceCertificate();
$allUserFile [] = [
'name' => $newFilename,
'shortName' => mb_substr($newFilename, 0, 40)."...",
'dateInsert' => new \Datetime()
];
$this->updateUserDataDateCertificate($user->getUserData());
$user->getUserData()->setVigilanceCertificate($allUserFile);
}catch(\Exception $e){
mail("anthony@softibox.com", "erreur upload certificat de vigilence", $e->getMessage());
}
catch(\Error $e){
mail("anthony@softibox.com", "erreur upload certificat de vigilence", $e->getMessage());
}
}
}else{
if (!empty($request->request->get('pays'))) {
$pays = $request->request->get('pays');
if ($pays == 'fr') {
$sendSubcontractorNotification = true;
$event = new SubContractorVigilanceCertificateAbsentEvent($user,$sendSubcontractorNotification);
$dispatcher->dispatch($event,SubContractorVigilanceCertificateAbsentEvent::NAME);
}
}
}
$entityManager->flush();
return new JsonResponse(['result' => 'success']);
}
#[Route('/api/subcontractors/{id}/delete-profile-picture', name: 'api_delete_subcontractor_profile_picture', methods: ['POST'])]
public function apiDeleteSubcontractorProfilePicture(User $user, Request $request, EntityManagerInterface $entityManager): JsonResponse
{
try {
$user->setPictureName('');
$entityManager->flush();
return new JsonResponse(['result' => 'success']);
} catch (\Exception $e) {
return new JsonResponse(['result' => 'failure', 'message' => $e->getMessage()]);
}
}
#[Route('/admin/fournisseurs/{subContractorId}/liens/{linkId}/supprimer', name: 'sub_contractor_delete_link', methods: ['GET'])]
public function deleteLinkToCompany(string $subContractorId, string $linkId, UserRepository $userRepository, SubContractorCompanyRepository $subContractorCompanyRepository, EntityManagerInterface $entityManager, Request $request, EventDispatcherInterface $dispatcher): Response
{
$user = $userRepository->find($subContractorId);
$link = $subContractorCompanyRepository->find($linkId);
if (null === $user || null === $link) {
throw new NotFoundHttpException();
}
$entityManager->remove($link);
$entityManager->flush();
$event = new SubContractorUpdatedEvent($user);
$dispatcher->dispatch($event, SubContractorUpdatedEvent::NAME);
$this->addFlash(
type: 'success',
message: 'L\'association entre l\'intervenant opérationnel et l\'entreprise a bien été supprimée',
);
return $this->redirect($request->headers->get('referer'), Response::HTTP_SEE_OTHER);
}
#[Route('/admin/fournisseurs/{id}/delete', name: 'sub_contractor_delete', methods: ['GET'])]
public function subContractorDelete (Request $request,UserService $userService, EntityManagerInterface $entityManager,EventDispatcherInterface $dispatcher, ServiceRepository $serviceRepository, MissionParticipantRepository $missionParticipantRepository, HistoriqueRepository $historiqueRepository, MessageRepository $messageRepository, SubContractorCompanyRepository $subContractorCompanyRepository, User $user){
$user=$userService->delete($user);
$event = new SubContractorUpdatedEvent($user);
$dispatcher->dispatch($event, SubContractorUpdatedEvent::NAME);
$this->addFlash(
type: 'success',
message: 'L\'intervenant opérationnel à bien été supprimé',
);
return $this->redirect($request->headers->get('referer'));
}
#[Route('/admin/fournisseurs/{subContractor}/jobs/{jobs}', name: 'subcontractor_edit_jobs', methods: ['POST'])]
public function editCompanyJobs(User $subContractor, SubContractorCompany $jobs, Request $request, EntityManagerInterface $entityManager): RedirectResponse
{
$form = $this->createForm(SubContractorCompanyType::class, $jobs);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush();
$this->addFlash(
type: 'success',
message: 'L\'association au client a bien été mis à jour',
);
} elseif ($form->isSubmitted()) {
$this->addFlash(
type: 'error',
message: 'Une erreur a eu lieu, merci de réessayer',
);
}
return $this->redirect($request->headers->get('referer'));
}
#[Route('/fournisseur/remove/{id}', name: 'sub_contractor_remove', methods: ['POST','GET'])]
public function removeSubContractor(Request $request,EventDispatcherInterface $dispatcher,User $user, UserService $userService, EntityManagerInterface $entityManager, ServiceRepository $serviceRepository, MissionParticipantRepository $missionParticipantRepository, HistoriqueRepository $historiqueRepository, MessageRepository $messageRepository, SubContractorCompanyRepository $subContractorCompanyRepository)
{
$user = $userService->delete($user);
$event = new SubContractorUpdatedEvent($user);
$dispatcher->dispatch($event, SubContractorUpdatedEvent::NAME);
$this->addFlash(
type: 'success',
message: 'Votre compte à bien été supprimé',
);
return $this->redirect($request->headers->get('referer'));
}
#[Route('/admin/fournisseurs/{id}/renvoie-email-inscription', name: 'sub_contractor_resend_registration_email', methods: ['GET','POST'])]
public function resendRegistrationEmail(Request $request, User $user, EventDispatcherInterface $dispatcher)
{
if (in_array("ROLE_MANAGER", $user->getRoles())) {
$event = new ClientUpdatedEvent($user, true);
$dispatcher->dispatch($event, ClientUpdatedEvent::NAME);
}else{
$event = new SubContractorUpdatedEvent($user, true);
$dispatcher->dispatch($event, SubContractorUpdatedEvent::NAME);
}
$this->addFlash(
type: 'success',
message: 'L\'email d\'inscription a bien été envoyé',
);
return $this->redirect($request->headers->get('referer'));
}
#[Route('/admin/mission/{id}/in-progress', name: 'list_mission_in_progress', methods: ['GET'])]
public function getMissionInProgressForSubcontractor(User $user, MissionRepository $missionRepository, Request $request ){
return $this->render('services/mission_not_in_progress.html.twig',[
'missions_in_progress'=>$missionRepository->getMissionInProgressForSubcontractor($user)
]);
}
#[Route('/admin/fourniseurs/export/{type}', name: 'sub_contractor_export', methods: ['GET'])]
public function subcontractorExport(string $type, UserRepository $userRepository, Request $request){
$users= $userRepository->findUserBytype($type);
$spreadsheet = new Spreadsheet();
// Get active sheet - it is also possible to retrieve a specific sheet
$sheet = $spreadsheet->getActiveSheet();
$title = $type == "subcontractor" ? "liste des intervenant operationnel" : "liste des clients";
// Set cell name and merge cells
$sheet->setCellValue('A1', $title)->mergeCells('A1:D1');
$sheet->setCellValue('A2', 'total')->mergeCells('A1:D1');
$sheet->setCellValue('B2', sizeof($users));
// Set column names
$columnNames = ['NOM', 'PRENOM', 'TELEPHONE','EMAIL', 'STATUT','ENTREPRISE','GENRE','DATE D\'INSCRIPTION','NEWSLETTER'];
$columnLetter = 'A';
foreach ($columnNames as $columnName) {
// Allow to access AA column if needed and more
$sheet->setCellValue($columnLetter.'3', $columnName);
++$columnLetter;
}
// Add data for each column
$columnValues = $this->formatUserToExportCsv($users) ;
$i = 4; // Beginning row for active sheet
foreach ($columnValues as $columnValue) {
$columnLetter = 'A';
foreach ($columnValue as $value) {
$sheet->setCellValue($columnLetter.$i, $value);
++$columnLetter;
}
$i++;
}
$contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
$writer = new Xlsx($spreadsheet) ;
$date = date('ymdhis');
$filename = "export_$type$date.xlsx";
$response = new StreamedResponse();
$response->headers->set('Content-Type', $contentType);
$response->headers->set('Content-Disposition', 'attachment;filename="'.$filename.'"');
$response->setPrivate();
$response->headers->addCacheControlDirective('no-cache', true);
$response->headers->addCacheControlDirective('must-revalidate', true);
$response->setCallback(function() use ($writer) {
$writer->save('php://output');
});
return $response;
// return $this->redirect($request->headers->get('referer'));
}
#[Route('/my-client-interlocutors/{userId}', name: 'my_client_interlocutors', methods: ['GET'])]
public function showInterlocutors(string $userId, UserRepository $userRepository, CampaignRepository $campaignRepository): Response
{
$nbYearMax = 3;
$user = $userRepository->find($userId);
$campaigns = $campaignRepository->findAllInterlocutors($user, $nbYearMax);
$allClientParticipantsMail = [];
$allClientParticipants = [];
foreach ($campaigns as $campaign) {
foreach ($campaign->getMissions() as $mission) {
foreach ($mission->getParticipants() as $participant) {
if ($participant->getRole() !== Role::ROLE_SUBCONTRACTOR) {
if (!in_array($participant->getUser()->getEmail(), $allClientParticipantsMail)) {
$allClientParticipantsMail[] = $participant->getUser()->getEmail();
$allClientParticipants[] = $participant;
}
}
}
}
}
return $this->renderForm('sub_contractor/interlocutors.html.twig', [
'clients' => $allClientParticipants
]);
}
private function formatUserToExportCsv(array $users):array
{
$userFormated = [];
$newletter = "";
foreach ($users as $user) {
$newletter =
$newletter.= $user->getFreqNotificationEverytime() != null && in_array(5, $user->getFreqNotificationEverytime()) ? "Tout le temps, " : "";
$newletter.= $user->getFreqNotificationPerDay() != null && in_array(5, $user->getFreqNotificationPerDay()) ? "Une fois par jour, " : "";
$newletter.= $user->getFreqNotificationPerWeek() != null && in_array(5, $user->getFreqNotificationPerWeek()) ? "Une fois par semaine, " : "";
$newletter.= $user->getFreqNotificationPerMonth() != null && in_array(5, $user->getFreqNotificationPerMonth()) ? "Une fois par mois " : "";
$userFormated = [...$userFormated,[
"lastname" => $user->getLastname(),
"firstname" => $user->getFirstname(),
"cellPhone" => $user->getCellPhone() != null ? $user->getCellPhone(): "-" ,
"email" => $user->getEmail() != null ? $user->getEmail(): "-" ,
"enabled" => $user->isEnabled() ? "actif" : "inactif",
"entreprise"=> $user->getCompany() != null ? $user->getCompany()->getName() : "-" ,
"gender" => "Monsieur",
"created_at" =>$user->getCreatedAt() != null ? $user->getCreatedAt()->format('Y-m-d H:i:s') : '-',
"newsletter"=> $newletter
]] ;
$newletter = "";
}
return $userFormated;
}
#[Route('/admin/fournisseurs/{id}/{availabilty<enable|disable>}', name: 'subcontractor_toggle_availabilty')]
public function toggleAvailability(User $user, EntityManagerInterface $entityManager): Response
{
$user->setEnabled(!$user->isEnabled());
$entityManager->flush();
$this->addFlash(
type: 'success',
message: 'L\'intervenant opérationnel '.$user.' a bien été '. ($user->isEnabled() ? 'activé' : 'désactivé')
);
return $this->redirectToRoute('sub_contractor_index');
}
private function updateUserDataDateCertificate($userData){
$dateAddCertificate = new \DateTime();
if(is_null($userData->getVigilanceCertificate())){
$userData->setDateAddCertificate($dateAddCertificate);
$userData->setDateUpdateCertificate($dateAddCertificate);
}else{
$userData->setDateUpdateCertificate($dateAddCertificate);
}
}
#[Route('/note-partenaire-modified/{id}-{idUser}', name: 'note_partenaire_modified', methods: ['GET','POST'])]
public function noteModificationPartenaire(NoteUser $note,$idUser, Request $request,EntityManagerInterface $entityManager): Response
{
$content = $request->request->get('info_mission_edit')['content'];
if (!is_null($content) and !empty($content)) {
$note->setContent($content);
$entityManager->persist($note);
$entityManager->flush();
}
$this->addFlash(
type: 'success',
message: 'Modification effectuée'
);
return $this->redirectToRoute('sub_contractor_edit',['id'=>$idUser]);
}
#[Route('/note-partenaire-deleted/{id}-{idUser}', name: 'note_partenaire_deleted', methods: ['GET','POST'])]
public function noteDeletedPartenaire(NoteUser $note,$idUser, Request $request,EntityManagerInterface $entityManager): Response
{
$entityManager->remove($note);
$entityManager->flush();
$this->addFlash(
type: 'success',
message: 'Suppression effectuée'
);
return $this->redirectToRoute('sub_contractor_edit',['id'=>$idUser]);
}
#[Route('/add-myflow-mail-to-subcontractor-and-client', name: 'addmyflow_mail_to_subcontractor_and_client', methods: ['GET','POST'])]
public function addMyFlowMail(AssociatedMailUserService $associatedMailUserService,EntityManagerInterface $entityManager): JsonResponse
{
//prendre tout les sous traitant et leur attribué un adresse email myflow.
$allSubcontractor = $entityManager->getRepository(User::class)->findOnlySubcontrator();
//dd(count($allSubcontractor));
foreach ($allSubcontractor as $subcontractor) {
$emailSubcontractor = $subcontractor->getParent() != null ? $subcontractor->getParent()->getEmail() : $subcontractor->getEmail();
try{
//verify if mail is already created
$myFlowEmail = $associatedMailUserService->getMailWithMyFlowDomain($emailSubcontractor);
$isExist = $entityManager->getRepository(User::class)->findBy(['myFlowEmail'=>$myFlowEmail]);
if (empty($isExist)) {
$associatedMailUserService->createEmailMyFlow($emailSubcontractor);
}
$subcontractor->setMyFlowEmail($myFlowEmail);
$entityManager->persist($subcontractor);
$entityManager->flush();
}catch(\Exception $e){}
}
return new JsonResponse('---success---');
}
}