<?php
namespace App\Controller\Backend;
use App\Controller\BaseController;
use App\Entity\Activity;
use App\Entity\Contact;
use App\Entity\Cotisation;
use App\Entity\EntityStatus;
use App\Entity\Entreprise;
use App\Entity\EntrepriseActivity;
use App\Entity\Etablissement;
use App\Entity\FirmLinkReason;
use App\Entity\FirmType;
use App\Entity\LinkedFirm;
use App\Entity\User;
use App\Form\Backend\EntrepriseType;
use App\Form\Backend\FirmFusionType;
use App\Repository\ContactRepository;
use App\Repository\CotisationRepository;
use App\Repository\EnterpriseRepository;
use App\Repository\EntityLogRepository;
use App\Repository\LinkedFirmRepository;
use App\Service\IsMemberService;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
#[Route('/admin')]
class EntrepriseController extends BaseController
{
#[Route(path: '/entreprises/{id}/show', name: 'show_entreprise')]
#[IsGranted('ROLE_USER', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function show(
Entreprise $entreprise,
LinkedFirmRepository $linkedFirmRepository,
IsMemberService $isMemberService
): Response
{
$isMemberService->checkIsMember($entreprise);
$formFusion = $this->createForm(FirmFusionType::class, null, [
'action' => $this->generateUrl('fusion_entreprise', ['id' => $entreprise->getId()])
]);
$linkedFirmWithFromMe = $linkedFirmRepository->findBy([
'fromFirm' => $entreprise
]);
$linkedFirmWithToMe = $linkedFirmRepository->findBy([
'toFirm' => $entreprise
]);
$lastCotisation = $entreprise->getCotisations()->last();
return $this->renderForm('backend/entreprise/show.html.twig', [
'controller_name' => 'EntrepriseController',
'menu' => 'entreprise',
'entreprise' => $entreprise,
'formFusion' => $formFusion,
'linkedFirmWithFromMe' => $linkedFirmWithFromMe,
'linkedFirmWithToMe' => $linkedFirmWithToMe,
'lastCotisation' => $lastCotisation
]);
}
#[Route('/entreprises/{id}/history', name: 'show_history_entreprise', methods: ['GET'])]
public function showHistory(
Entreprise $entreprise,
EntityLogRepository $repository,
PaginatorInterface $paginator,
Request $request
): Response
{
$query = $repository->queryFindBy(Entreprise::class, $entreprise->getId());
$logs = $paginator->paginate(
$query,
$request->query->getInt('page', 1),
self::ITEM_PER_PAGE
);
return $this->render('backend/entreprise/show_history.html.twig', [
'controller_name' => 'EntrepriseController',
'menu' => 'entreprise',
'entreprise' => $entreprise,
'logs' => $logs
]);
}
#[Route(path: '/entreprises/{id}/edit', name: 'edit_entreprise')]
#[IsGranted('ROLE_UPDATE_ENTITY', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function edit(
Request $request,
Entreprise $entreprise,
EntityManagerInterface $em,
IsMemberService $isMemberService
): RedirectResponse|Response
{
$isMemberService->checkIsMember($entreprise);
$form = $this->createForm(EntrepriseType::class, $entreprise);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($entreprise);
$em->flush();
$this->addFlash(
'success',
'Enregistrement effectué avec succès'
);
return $this->redirectToRoute('show_entreprise', ['id' => $entreprise->getId()]);
}
return $this->renderForm('backend/entreprise/edit.html.twig', [
'controller_name' => 'EntrepriseController',
'menu' => 'entreprise',
'entreprise' => $entreprise,
'form' => $form
]);
}
#[Route(path: '/entreprises/add', name: 'create_enterprise')]
#[IsGranted('ROLE_ADD_ENTITY', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function add(Request $request, EntityManagerInterface $em): Response
{
$entreprise = new Entreprise();
$entreprise->setFirmType($em->getRepository(FirmType::class)->find(1));
$activities = $em->getRepository(Activity::class)->findBy([
'isEnabled' => true
]);
foreach ($activities as $activity) {
$firmActivity = new EntrepriseActivity();
$firmActivity
->setEntreprise($entreprise)
->setActivity($activity)
;
$entreprise->addEntrepriseActivity($firmActivity);
}
$form = $this->createForm(EntrepriseType::class, $entreprise);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($entreprise);
$em->flush();
$this->addFlash(
'success',
'Enregistrement effectué avec succès'
);
return $this->redirectToRoute('show_entreprise', ['id' => $entreprise->getId()]);
}
return $this->renderForm(
'backend/entreprise/edit.html.twig', [
'controller_name' => 'EntrepriseController',
'menu' => 'entreprise',
'form' => $form,
'entreprise' => $entreprise,
'status' => "Création d'une nouvelle entreprise",
]);
}
#[Route(path: '/entreprises/{id}/archive', name: 'archive_enterprise', methods: ['DELETE', 'POST'])]
#[IsGranted('ROLE_DELETE_ENTITY', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function archive(Entreprise $entreprise, Request $request, EntityManagerInterface $em): JsonResponse
{
$data = json_decode($request->getContent(), true);
if ($this->isCsrfTokenValid('entreprise_'.$entreprise->getId(), $data['_token'])) {
$entreprise->setStatus(EntityStatus::STATUS_ARCHIVED);
/** @var Contact $contact */
foreach ($entreprise->getContacts() as $contact) {
$contact->setStatus(EntityStatus::STATUS_ARCHIVED);
}
/** @var Cotisation $cotisation */
foreach($entreprise->getCotisations() as $cotisation) {
$cotisation->setStatus(EntityStatus::STATUS_ARCHIVED);
}
$em->persist($entreprise);
$em->flush();
return new JsonResponse([
'status' => 'ok',
'message' => 'Archivage effectuée avec succès'
]);
}
return new JsonResponse([
'status' => 'nok',
'message' => 'Erreur lors de l\'archivage. Merci de contacter un administrateur.'
]);
}
#[Route('/entreprises/{id}/show-cotisations', name: 'show_entreprise_cotisation', methods: ['GET'])]
public function cotisations(Entreprise $entreprise): Response
{
return $this->render('backend/entreprise/show_cotisation.html.twig', [
'controller_name' => 'EntrepriseController',
'menu' => 'entreprise',
'entreprise' => $entreprise
]);
}
#[Route('/entreprises/{id}/duplicate', name: 'duplicate_entreprise', methods: ['GET'])]
#[IsGranted('ROLE_ADMIN', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function duplicate(Entreprise $entreprise, Request $request, EntityManagerInterface $em): RedirectResponse
{
$newFirm = new Entreprise();
$newFirm
->setSouhaiteAdherer($entreprise->getSouhaiteAdherer())
->setCommentaires($entreprise->getCommentaires())
->setFirmType($entreprise->getFirmType())
->setTel1($entreprise->getTel1())
->setTel2($entreprise->getTel2())
->setEmail($entreprise->getEmail())
->setStatus(EntityStatus::STATUS_IN_CREATION)
->setRaisonSocial($entreprise->getRaisonSocial())
->setAdresse($entreprise->getAdresse())
->setAdresse2($entreprise->getAdresse2())
->setCodePostal($entreprise->getCodeApe())
->setVille($entreprise->getVille())
->setAutreActivite($entreprise->getAutreActivite())
->setAutreSpecialite($entreprise->getAutreSpecialite())
->setChiffreDernierTotal($entreprise->getChiffreDernierTotal())
->setCodeAdherent($entreprise->getCodeAdherent())
->setCodeApe($entreprise->getCodeApe())
->setCodeSiren($entreprise->getCodeSiren())
->setCommission($entreprise->getCommission())
->setDepartement($entreprise->getDepartement())
->setFigurerAnnuaireAdherents($entreprise->getFigurerAnnuaireAdherents())
->setGroupeEntreprise($entreprise->getGroupeEntreprise())
->setHomeRegion($entreprise->getHomeRegion())
->setIsQualiNegoce($entreprise->isIsQualiNegoce())
->setQualiNegoceCertificationDate($entreprise->getQualiNegoceCertificationDate())
->setQualiNegoceContactName($entreprise->getQualiNegoceContactName())
->setVolumeAnimaux($entreprise->getVolumeAnimaux())
->setTransportPourAutrui($entreprise->getTransportPourAutrui())
->setTransporteur($entreprise->getTransporteur())
->setTotalCountSpecies($entreprise->getTotalCountSpecies())
->setSyndicat($entreprise->getSyndicat())
->setStatutPaiement($entreprise->getStatutPaiement())
->setStatutPaiment($entreprise->getStatutPaiment())
->setRaisonNonAdhesionAutre($entreprise->getRaisonNonAdhesionAutre())
->setNumTvaIntracom($entreprise->getNumTvaIntracom())
->setRaisonNonAdhesion($entreprise->getRaisonNonAdhesion())
->setNumEdeNegoce($entreprise->getNumEdeNegoce())
->setNumEdeElevage($entreprise->getNumEdeElevage())
->setNumEdeCentre($entreprise->getNumEdeCentre())
->setNombreEmployes($entreprise->getNombreEmployes())
;
/** @var EntrepriseActivity $entrepriseActivity */
foreach ($entreprise->getEntrepriseActivities() as $entrepriseActivity) {
$newActivity = new EntrepriseActivity();
$newActivity
->setActivity($entrepriseActivity->getActivity())
->setEntreprise($newFirm)
->setChecked($entrepriseActivity->isChecked())
->setNumber($entrepriseActivity->getNumber())
;
$newFirm->addEntrepriseActivity($newActivity);
}
/** @var Etablissement $etablissement */
foreach ($entreprise->getEtablissements() as $etablissement) {
$newEtablissement = new Etablissement();
$newEtablissement
->setEntreprise($newFirm)
->setVille($etablissement->getVille())
->setSyndicat($etablissement->getSyndicat())
->setDepartement($etablissement->getDepartement())
->setCodePostal($etablissement->getCodePostal())
->setAdresse($etablissement->getAdresse())
->setNom($etablissement->getNom())
->setCodeEde($etablissement->getCodeEde())
->setCodeSiret($etablissement->getCodeSiret())
->setCommentaire($etablissement->getCommentaire())
->setDateCessation($etablissement->getDateCessation())
->setEmailBureau($etablissement->getEmailBureau())
->setSiegeSocial($etablissement->getSiegeSocial())
->setTelBureau1($etablissement->getTelBureau1())
->setTelBureau2($etablissement->getTelBureau2())
;
$newFirm->addEtablissement($newEtablissement);
}
/** @var Contact $contact */
foreach ($entreprise->getContacts() as $contact) {
$newContact = new Contact();
$newContact
->setCommentaire($contact->getCommentaire())
->setNom($contact->getNom())
->setPrenom($contact->getPrenom())
->setAdresse($contact->getAdresse())
->setAdresse2($contact->getAdresse2())
->setCodePostal($contact->getCodePostal())
->setVille($contact->getVille())
->setUser(null)
->setIsResponsible($contact->getIsResponsible())
->setEmailContact($contact->getEmailContact())
->setTelPortable($contact->getTelPortable())
->setTelPortable2($contact->getTelPortable2())
->setTelBureau($contact->getTelBureau())
->setFirm($newFirm)
->setCivilite($contact->getCivilite())
->setDateNaissance($contact->getDateNaissance())
->setIsPrivileged($contact->getIsPrivileged())
->setSyndicatContacts($contact->getSyndicatContacts())
->setTypeContact($contact->getTypeContact())
;
$newFirm->addContact($newContact);
}
$link = new LinkedFirm();
$link
->setType($em->getRepository(FirmLinkReason::class)->find(2))
->setDate(new DateTime())
->setFromFirm($entreprise)
->setToFirm($newFirm)
;
$em->persist($newFirm);
$em->persist($link);
$em->flush();
$this->addFlash(
'success',
'Duplication effectuée avec succès'
);
return $this->redirectToRoute('show_entreprise', ['id' => $newFirm->getId()]);
}
#[Route('/entreprises/{id}/fusion', name: 'fusion_entreprise', methods: ['POST'])]
#[IsGranted('ROLE_ADMIN', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function fusion(Entreprise $entreprise, Request $request, EntityManagerInterface $em): RedirectResponse
{
$form = $this->createForm(FirmFusionType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$linkedFirm = new LinkedFirm();
$linkedFirm
->setFromFirm($entreprise)
->setToFirm($form->get('toFirm')->getData())
->setDate($form->get('date')->getData())
->setType($form->get('type')->getData())
->setComment($form->get('comment')->getData())
;
$entreprise->setStatus(Entreprise::STATUS_MERGED);
$em->persist($entreprise);
$em->persist($linkedFirm);
$em->flush();
$this->addFlash(
'success',
'Fusion effectuée avec succès'
);
return $this->redirectToRoute('show_entreprise', ['id' => $linkedFirm->getToFirm()->getId()]);
}
$this->addFlash(
'error',
'Aucune donnée envoyée'
);
return $this->redirectToRoute('show_entreprise', ['id' => $entreprise->getId()]);
}
}