<?php
namespace App\Controller\userController;
use App\Controller\api\FirebaseController;
use App\Controller\api\GoogleMapsController;
use App\Controller\basisController\UserBasisController;
use App\Controller\emailVersandController\MailsWarteschleifeController;
use App\Controller\oAuthLoginController\LoginController;
use App\Controller\seminarController\SeminarController;
use App\Entity\SchulungBeobachten;
use App\Entity\SchulungBewertungen;
use App\Entity\SchulungKommentarAntworten;
use App\Entity\SchulungKommentare;
use App\Entity\UserEmpfehlungen;
use App\Entity\UserFavoriten;
use App\Entity\UserNotification;
use App\Repository\BuchungenRepository;
use App\Repository\BuchungenSeminareRepository;
use App\Repository\BuchungenSeminareTeilnehmerRepository;
use App\Repository\DozentRepository;
use App\Repository\FirebaseNotificationRepository;
use App\Repository\FirmenprofilRepository;
use App\Repository\KonfiguratorThemenRepository;
use App\Repository\SchulungBeobachtenRepository;
use App\Repository\SchulungBewertungenRepository;
use App\Repository\SchulungenRepository;
use App\Repository\SchulungKommentareRepository;
use App\Repository\SchulungsArtRepository;
use App\Repository\SchulungsfilterungRepository;
use App\Repository\SchulungsTermineRepository;
use App\Repository\UserEmpfehlungenRepository;
use App\Repository\UserNotificationRepository;
use App\Repository\UserProfilRepository;
use App\Repository\UserRepository;
use Kreait\Firebase\Contract\Messaging;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Repository\UserFavoritenRepository;
use App\Repository\ZielgruppeRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class ProduktDetailsController extends UserBasisController
{
#[Route('/user/produkt/details/{id}', name: 'produkt_details')]
public function index(Request $request, $id,
SchulungenRepository $schulungenRepository,
SchulungsfilterungRepository $schulungsfilterungRepository,
SchulungBeobachtenRepository $schulungBeobachtenRepository,
ZielgruppeRepository $zielgruppeRepository,
KonfiguratorThemenRepository $konfiguratorThemenRepository,
SchulungsArtRepository $schulungsArtRepository,
SchulungsTermineRepository $schulungsTermineRepository,
UserEmpfehlungenRepository $userEmpfehlungenRepository,
FirmenprofilRepository $firmenprofilRepository,
UserProfilRepository $userProfilRepository,
UserFavoritenRepository $userFavoritenRepository,
BuchungenRepository $buchungenRepository,
GoogleMapsController $googleMapsController,
UserRepository $userRepository,
TokenStorageInterface $tokenStorage,
HttpClientInterface $client,
SeminarController $seminarController): Response
{
$userId = $this->getUser()?->getId();
if (strlen($request->query->get('id')) > 0) {
//Benutzer vom CELSEO-Intranet einloggen
$jsonData = [];
$jsonData['id'] = $request->query->get('id');
$jsonData['token'] = $request->query->get('token');
$jsonData['campusId'] = $request->query->get('campusId');
$intranetResponse = $client->request('POST', $_ENV['CELSEO_INTRANET_API_URL'] . 'login/kontrolle', [
'headers' => [
'Content-Type' => 'application/json',
'AuthenticationToken' => $_ENV['CELSEO_INTRANET_API_KEY']
],
'json' => $jsonData
])->toArray(false);
if ($intranetResponse['ergebnis'] != 0) {
$user = $userRepository->findOneBy(['id' => $intranetResponse['ergebnis']]);
if ($user != null) {
$loginController = new LoginController($userFavoritenRepository);
$loginController->loginUser($user, $tokenStorage, $request);
$userId = $this->getUser()?->getId();
}
}
}
$offeneBuchung = false;
if ($userId != null) {
$buchungen = $buchungenRepository->findBy(['user' => $this->getUser(), 'bezahlstatus' => 0]);
foreach ($buchungen as $buchung) {
foreach ($buchung->getBuchungenSeminare() as $seminar) {
if ($seminar->getTermin()->getSchulung()->getId() == $id) {
$offeneBuchung = true;
}
}
}
}
$sessionId = $this->session->getId();
$favoriten = null;
if ($userId == null) {
$favoriten = $userFavoritenRepository->findOneBy(['session_id' => $sessionId, 'schulung' => $id]);
} else {
$favoriten = $userFavoritenRepository->findOneBy(['user_id' => $userId, 'schulung' => $id]);
}
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
if ($schulung == null) {
return $this->redirectToRoute('user_start');
}
if ($schulung->getNurCelsisten() == 4) {
$zugangPrivatschulung = false;
if (strlen($request->query->get('guid')) > 0 && $request->query->get('guid') == $schulung->getImportFehler()) {
$zugangPrivatschulung = true;
}
if (!$zugangPrivatschulung) {
return $this->redirectToRoute('user_start');
}
}
$firma = $this->getUser()?->getFirmenprofil();
$empfehlung = null;
if ($firma != null) {
$empfehlung = $userEmpfehlungenRepository->findOneBy(['firma' => $firma, 'schulung_id' => $schulung->getId(), 'user' => $this->getUser(), 'buchungen_id' => null]);
}
$userIDs = [];
$userIDs[] = $schulung->getErstellerUserId();
if (count($schulung->getSchulungKommentare()) > 0) {
foreach ($schulung->getSchulungKommentare() as $kommentare) {
if ($kommentare->getUserId() != null) {
$userIDs[] = $kommentare->getUserId();
}
if (count($kommentare->getAntworten()) > 0) {
foreach ($kommentare->getAntworten() as $antwort) {
$userIDs[] = $antwort->getUserId();
}
}
}
}
$sterne = [0, 0, 0, 0, 0];
$anzahlBewertungen = count($schulung->getBewertungen());
$durchschnittBewertungen = 0;
if ($anzahlBewertungen > 0) {
foreach ($schulung->getBewertungen() as $bewertung) {
$userIDs[] = $bewertung->getUserId();
$sterne[$bewertung->getSterne() - 1] = $sterne[$bewertung->getSterne() - 1] + 1;
}
$durchschnittBewertungen = (($sterne[0] * 1) + ($sterne[1] * 2) + ($sterne[2] * 3) + ($sterne[3] * 4) + ($sterne[4] * 5)) / $anzahlBewertungen;
}
$schulungErstellerId = $schulung->getErstellerFirmenId();
$meineFirmenId = $this->getUser()?->getFirmenProfil()?->getId();
// Restanzahl Teilnehmer herausfinden
$freiePlaetze = [];
foreach ($schulung->getSchulungstermine() as $termin) {
$tmpFreiePlaetze = [];
$tmpFreiePlaetze['freiePlaetze'] = $seminarController->freie_plaetze_ermitteln($termin->getId());
$tmpFreiePlaetze['terminId'] = $termin->getId();
$freiePlaetze[] = $tmpFreiePlaetze;
}
$meineThemengebiete = [];
$arrayThemengebiete = $schulung->getSuchfilter();
if ($arrayThemengebiete != null) {
$arrayThemengebiete = json_decode($arrayThemengebiete, true);
foreach ($arrayThemengebiete['filter'] as $arrayThemengebiet) {
$meineThemengebiete[] = $arrayThemengebiet['t'];
}
$meineThemengebiete = array_unique($meineThemengebiete);
}
$meineZielgruppen = [];
$arrayZielgruppen = $schulung->getSuchfilter();
if ($arrayZielgruppen != null) {
$arrayZielgruppen = json_decode($arrayZielgruppen, true);
foreach ($arrayZielgruppen['filter'] as $arrayZielgruppe) {
$meineZielgruppen[] = $arrayZielgruppe['z'];
}
$meineZielgruppen = array_unique($meineZielgruppen);
}
$allgemeinerAnmeldeschluss = null;
if ($schulung->getSchulungsart()->getId() == 4) {
$termine = $schulungsTermineRepository->findBy(['schulung' => $schulung]);
foreach ($termine as $termin) {
if ($termin->getAnmeldeschluss() != null) {
$allgemeinerAnmeldeschluss = $termin->getAnmeldeschluss();
}
}
}
$entfernungen = [];
if ($this->getUser()?->getUserProfil() != null) {
foreach ($schulung->getSchulungstermine() as $termin) {
if ($termin->getGoogleLen() != null) {
$lat = 0;
$len = 0;
if ($this->getUser()->getUserProfil()->getGoogleLat() != null) {
$lat = $this->getUser()->getUserProfil()->getGoogleLat();
$len = $this->getUser()->getUserProfil()->getGoogleLen();
} else {
if ($this->getUser()->getFirmenprofil() != null && $this->getUser()->getFirmenprofil()->getGoogleLat() != null) {
$lat = $this->getUser()->getFirmenprofil()->getGoogleLat();
$len = $this->getUser()->getFirmenprofil()->getGoogleLen();
}
}
if ($lat != 0) {
$entfernungInMeter = $googleMapsController->vincentyGreatCircleDistance($lat, $len, $termin->getGoogleLat(), $termin->getGoogleLen());
$entfernung = [];
$entfernung['terminId'] = $termin->getId();
$entfernung['km'] = round($entfernungInMeter / 1000, 2);
$entfernungen[] = $entfernung;
}
}
}
}
$zurueckLink = null;
if (strlen($request->query->get('back')) > 0) {
$zurueckLink = $request->query->get('back');
}
$schulungBeobachten = $schulungBeobachtenRepository->findOneBy(['schulung' => $schulung, 'user' => $this->getUser()]);
$schulungsfilterungen = $schulungsfilterungRepository->findAll();
$vorschlagRang = [];
$vorschlagFirmenIDs = [];
$vorschlagSchulungenIDs = [];
$eigeneSuchbegriffe = [];
$dbSuchbegriffe = $schulung->getSuchbegriffe();
$arrSuchbegriffe = explode(',', $dbSuchbegriffe);
foreach ($arrSuchbegriffe as $suchbegriff) {
if (strlen(trim($suchbegriff) > 1)) {
$eigeneSuchbegriffe[] = trim($suchbegriff);
}
}
foreach ($schulungsfilterungen as $schulungsfilterung) {
if ($schulungsfilterung->getSchulung()->getId() != $id) {
$anzahlZuWenigTrefer = 0;
if ($schulungsfilterung->getSchulung()->getErstellerFirmenId() == $schulung->getErstellerFirmenId()) {
$anzahlZuWenigTrefer = 1;
}
$vorschlagSuchbegriffe = $eigeneSuchbegriffe;
$dbSuchbegriffe = $schulungsfilterung->getSuchbegriffe();
$arrSuchbegriffe = explode(',', $dbSuchbegriffe);
foreach ($arrSuchbegriffe as $suchbegriff) {
if (strlen(trim($suchbegriff) > 1)) {
$vorschlagSuchbegriffe[] = trim($suchbegriff);
}
}
$kontrolleSuchbegriffe = array_count_values($vorschlagSuchbegriffe);
$anzahlGesamt = 0;
foreach ($kontrolleSuchbegriffe as $key => $value) {
$anzahlGesamt = $anzahlGesamt + $value - 1;
}
if ($anzahlGesamt > $anzahlZuWenigTrefer) {
$tmpVorschlagRang['schulungsId'] = $schulungsfilterung->getSchulung()->getId();
$tmpVorschlagRang['treffer'] = $anzahlGesamt;
$vorschlagRang[] = $tmpVorschlagRang;
$vorschlagFirmenIDs[] = $schulungsfilterung->getSchulung()->getErstellerFirmenId();
$vorschlagSchulungenIDs[] = $schulungsfilterung->getSchulung()->getId();
}
}
}
$vorschlagFirmenIDs = array_unique($vorschlagFirmenIDs);
$vorschlagSchulungenIDs = array_unique($vorschlagSchulungenIDs);
$vorschlaege = $schulungenRepository->findBy(['id' => $vorschlagSchulungenIDs]);
$vorschlaegeFirmen = $firmenprofilRepository->findBy(['id' => $vorschlagFirmenIDs]);
if ($schulung->getFreigabe() == 1 or $schulungErstellerId == $meineFirmenId or in_array("ROLE_CELSEO_MASTERADMIN", $this->getUser()->getRoles())) {
return $this->render('user/produkt_details/index.html.twig', [
'schulung' => $schulung,
'schulungBeobachten' => $schulungBeobachten,
'allgemeinerAnmeldeschluss' => $allgemeinerAnmeldeschluss,
'sterne' => $sterne,
'entfernungen' => $entfernungen,
'durchschnitt' => $durchschnittBewertungen,
'favoriten' => $favoriten,
'zielgruppen' => $zielgruppeRepository->findAll(),
'meine_zielgruppen' => $meineZielgruppen,
'themengebiete' => $konfiguratorThemenRepository->findAll(),
'meine_themengebiete' => $meineThemengebiete,
'schulungsarten' => $schulungsArtRepository->findAll(),
'freiePlaetze' => $freiePlaetze,
'userProfile' => $userProfilRepository->findBy(['user' => $userIDs]),
'firmenprofil' => $firmenprofilRepository->findOneBy(['id' => $schulung->getErstellerFirmenId()]),
'id' => $id,
'offeneBuchung' => $offeneBuchung,
'zurueckLink' => $zurueckLink,
'empfehlung' => $empfehlung,
'vorschlaege' => $vorschlaege,
'vorschlaegeFirmen' => $vorschlaegeFirmen,
'vorschlagRang' => $vorschlagRang,
]);
}
return $this->redirectToRoute('user_start', [], Response::HTTP_SEE_OTHER);
}
#[Route('/user/produkt/details/termine/{id}', name: 'produkt_details_termine', methods: ['GET'])]
public function produkt_details_termine($id,
SchulungenRepository $schulungenRepository,
SchulungsTermineRepository $schulungsTermineRepository,
GoogleMapsController $googleMapsController,
UserEmpfehlungenRepository $userEmpfehlungenRepository,
SeminarController $seminarController): Response
{
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
$termine = $schulungsTermineRepository->findBy(['schulung' => $schulung], ['von' => 'ASC']);
$entfernungen = [];
// Restanzahl Teilnehmer herausfinden
$freiePlaetze = [];
foreach ($termine as $termin) {
$tmpFreiePlaetze = [];
$tmpFreiePlaetze['freiePlaetze'] = $seminarController->freie_plaetze_ermitteln($termin->getId());
$tmpFreiePlaetze['terminId'] = $termin->getId();
$freiePlaetze[] = $tmpFreiePlaetze;
if ($this->getUser()?->getUserProfil() != null) {
if ($termin->getGoogleLen() != null) {
$lat = 0;
$len = 0;
if ($this->getUser()->getUserProfil()->getGoogleLat() != null) {
$lat = $this->getUser()->getUserProfil()->getGoogleLat();
$len = $this->getUser()->getUserProfil()->getGoogleLen();
} else {
if ($this->getUser()->getFirmenprofil() != null && $this->getUser()->getFirmenprofil()->getGoogleLat() != null) {
$lat = $this->getUser()->getFirmenprofil()->getGoogleLat();
$len = $this->getUser()->getFirmenprofil()->getGoogleLen();
}
}
if ($lat != 0) {
$entfernungInMeter = $googleMapsController->vincentyGreatCircleDistance($lat, $len, $termin->getGoogleLat(), $termin->getGoogleLen());
$entfernung = [];
$entfernung['terminId'] = $termin->getId();
$entfernung['km'] = round($entfernungInMeter / 1000, 2);
$entfernungen[] = $entfernung;
}
}
}
}
$firma = $this->getUser()?->getFirmenprofil();
$empfehlung = null;
if ($firma != null) {
$empfehlung = $userEmpfehlungenRepository->findOneBy(['firma' => $firma, 'schulung_id' => $schulung->getId(), 'user' => $this->getUser(), 'buchungen_id' => null]);
}
return $this->render('user/produkt_details/schulung_alle_termine.html.twig', [
'termine' => $termine,
'freiePlaetze' => $freiePlaetze,
'empfehlung' => $empfehlung,
'entfernungen' => $entfernungen,
]);
}
#[Route('/user/produkt/details/schulung_beobachten/{id}', name: 'produkt_details_schulung_beobachten')]
public function produkt_details_schulung_beobachten($id, SchulungenRepository $schulungenRepository,
SchulungBeobachtenRepository $schulungBeobachtenRepository,
EntityManagerInterface $entityManager): Response
{
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
if ($schulung != null) {
$schulungBeobachten = $schulungBeobachtenRepository->findOneBy(['user' => $this->getUser(), 'schulung' => $schulung]);
if ($schulungBeobachten == null && $this->getUser()?->getId() != null) {
$schulungBeobachten = new SchulungBeobachten();
$schulungBeobachten->setUser($this->getUser());
$schulungBeobachten->setSchulung($schulung);
$entityManager->persist($schulungBeobachten);
$entityManager->flush();
}
}
$returnData["error"] = false;
return new JsonResponse($returnData);
}
#[Route('/user/produkt/details/schulung_beobachten_loeschen/{id}', name: 'produkt_details_schulung_beobachten_loeschen')]
public function produkt_details_schulung_beobachten_loeschen($id, SchulungenRepository $schulungenRepository,
SchulungBeobachtenRepository $schulungBeobachtenRepository,
EntityManagerInterface $entityManager): Response
{
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
if ($schulung != null) {
$schulungBeobachten = $schulungBeobachtenRepository->findOneBy(['user' => $this->getUser(), 'schulung' => $schulung]);
if ($schulungBeobachten != null) {
$entityManager->remove($schulungBeobachten);
$entityManager->flush();
}
}
$returnData["error"] = false;
return new JsonResponse($returnData);
}
#[Route('/user/produkt/details/fremdschulung/counter/{id}', name: 'user_produkt_fremdschulung_counter')]
public function user_produkt_fremdschulung_counter($id, SchulungenRepository $schulungenRepository,
EntityManagerInterface $entityManager): Response
{
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
if ($schulung != null && $schulung->getFremdanbieterStatus() == 9) {
$schulung->setFremdlinkCounter($schulung->getFremdlinkCounter() + 1);
$entityManager->persist($schulung);
$entityManager->flush();
}
$returnData["error"] = false;
return new JsonResponse($returnData);
}
#[Route('/user/produkt/details/warenkorb/celseo/anfrage', name: 'user_produkt_warenkorb_celseo_anfrage')]
public function user_produkt_warenkorb_celseo_anfrage(Request $request,
BuchungenRepository $buchungenRepository,
EntityManagerInterface $entityManager): Response
{
$returnData["error"] = true;
$buchung = $buchungenRepository->findOneBy(['id' => $request->get('buchungId')]);
if ($buchung != null && $buchung->getUser()->getId() == $this->getUser()?->getId()) {
if (strlen($request->get('buchungAnfrageCelseoText')) > 3) {
$buchung->setAblehnungstext($request->get('buchungAnfrageCelseoText'));
} else {
$buchung->setAblehnungstext(null);
}
$entityManager->persist($buchung);
$entityManager->flush();
$returnData["error"] = false;
}
return new JsonResponse($returnData);
}
#[Route('/user/produkt/details/warenkorb/{terminId}', name: 'produkt_details_warenkorb', methods: ['GET'])]
public function produkt_details_warenkorb($terminId,
SchulungsTermineRepository $schulungsTermineRepository,
UserRepository $userRepository,
SchulungsArtRepository $schulungsArtRepository,
BuchungenSeminareTeilnehmerRepository $buchungenSeminareTeilnehmerRepository,
SeminarController $seminarController): Response
{
$userID = $this->getUser()?->getId();
$mitgliederIDs = [];
$stornierteMitgliederIDs = [];
$termin = $schulungsTermineRepository->findOneBy(['id' => $terminId]);
$firmenmitglieder = $userRepository->findBy(['firmen_profil' => $this->getUser()?->getFirmenProfil()?->getId()]);
$freiePlaetze = $seminarController->freie_plaetze_ermitteln($termin->getId());
$stornoBis = null;
$terminVon = clone $termin->getVon();
if ($termin->getSchulung()->getSchulungsart()->getId() != 1) {
if ($termin->getSchulung()->getSchulungsart()->getId() == 4) {
$stornoBis = $termin->getSchulung()->getSeminarreiheStartdatum()->modify('-' . $termin->getSchulung()->getStornoInTagen() * 24 . ' hours');
} else {
$stornoBis = $terminVon->modify('-' . $termin->getSchulung()->getStornoInTagen() * 24 . ' hours');
}
}
if ($firmenmitglieder == null) {
$mitgliederIDs[] = $userID;
} else {
foreach ($firmenmitglieder as $firmenmitglied) {
$mitgliederIDs[] = $firmenmitglied->getId();
}
}
$buchungseminareTeilnehmer = $buchungenSeminareTeilnehmerRepository->findBy(['user' => $mitgliederIDs]);
foreach ($buchungseminareTeilnehmer as $buchung) {
if ($buchung->getBuchungenSeminar()->getTermin()->getId() == $terminId) {
if ($buchung->getBuchungenSeminar()->getBuchung()->getBezahlstatus() >= 30) {
if ($buchung->getStatus() != 0) {
$stornierteMitgliederIDs[] = $buchung->getUser()->getId();
}
$mitgliederIDs = array_diff($mitgliederIDs, [$buchung->getUser()->getId()]);
}
}
}
$kostenlosesOnDemand = false;
if ($termin->getSchulung()->getSchulungsart()->getId() == 1 && $termin->getSchulung()->getPreis() == 0) {
$kostenlosesOnDemand = true;
}
return $this->render('user/produkt_details/schulung_warenkorb.html.twig', [
'termin' => $termin,
'stornoBis' => $stornoBis,
'stornierteMitgliederIDs' => $stornierteMitgliederIDs,
'firmenmitglieder' => $firmenmitglieder,
'mitgliederOhneBuchung' => $mitgliederIDs,
'schulungsarten' => $schulungsArtRepository->findAll(),
'freiePlaetze' => $freiePlaetze,
'kostenlosesOnDemand' => $kostenlosesOnDemand,
]);
}
#[Route('/user/produkt/details/empfehlen/{id}', name: 'produkt_details_empfehlen', methods: ['GET'])]
public function produkt_details_empfehlen($id,
SchulungenRepository $schulungenRepository,
SchulungsTermineRepository $schulungsTermineRepository,
UserRepository $userRepository,
SeminarController $seminarController,
BuchungenSeminareTeilnehmerRepository $buchungenSeminareTeilnehmerRepository): Response
{
$firmenmitglieder = null;
$mitgliederIDs = [];
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
if ($schulung != null && $this->getUser()?->getFirmenprofil() != null && in_array("ROLE_FIRMA_BUCHUNGEN", $this->getUser()->getRoles())) {
$firmenmitglieder = $userRepository->findBy(['firmen_profil' => $this->getUser()?->getFirmenProfil()?->getId()]);
foreach ($firmenmitglieder as $firmenmitglied) {
if ($firmenmitglied->getId() != $this->getUser()->getId())
$mitgliederIDs[] = $firmenmitglied->getId();
}
$buchungseminareTeilnehmer = $buchungenSeminareTeilnehmerRepository->findBy(['user' => $mitgliederIDs]);
foreach ($buchungseminareTeilnehmer as $teilnehmer) {
if ($teilnehmer->getBuchungenSeminar()->getTermin()->getSchulung()->getId() == $id) {
if ($teilnehmer->getBuchungenSeminar()->getBuchung()->getBezahlstatus() >= 30) {
$mitgliederIDs = array_diff($mitgliederIDs, [$teilnehmer->getUser()->getId()]);
}
}
}
}
$termine = $schulungsTermineRepository->findBy(['schulung' => $schulung], ['von' => 'ASC']);
$freiePlaetze = [];
foreach ($termine as $termin) {
$tmpFreiePlaetze = [];
$tmpFreiePlaetze['freiePlaetze'] = $seminarController->freie_plaetze_ermitteln($termin->getId());
$tmpFreiePlaetze['terminId'] = $termin->getId();
$freiePlaetze[] = $tmpFreiePlaetze;
}
return $this->render('user/produkt_details/schulung_empfehlen.html.twig', [
'schulung' => $schulung,
'termine' => $termine,
'freiePlaetze' => $freiePlaetze,
'firmenmitglieder' => $firmenmitglieder,
'mitgliederOhneBuchung' => $mitgliederIDs,
]);
}
#[Route('/user/produkt/details/empfehlungen_senden/{id}', name: 'produkt_details_empfehlungen_senden')]
public function produkt_details_empfehlungen_senden(Request $request, $id,
SchulungenRepository $schulungenRepository,
UserRepository $userRepository,
UserEmpfehlungenRepository $empfehlungenRepository,
MailsWarteschleifeController $mailsWarteschleifeController,
FirebaseController $firebaseController,
Messaging $messaging,
FirebaseNotificationRepository $firebaseNotificationRepository,
EntityManagerInterface $entityManager): Response
{
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
$teilnehmers = json_decode($request->get('arrayTeilnehmer'), true);
$datum = new \DateTime('now', new \DateTimeZone('Europe/Berlin'));
if ($schulung != null && count($teilnehmers) > 0 && in_array("ROLE_FIRMA_BUCHUNGEN", $this->getUser()->getRoles())) {
$firmenmitglieder = $userRepository->findBy(['firmen_profil' => $this->getUser()->getFirmenProfil()]);
foreach ($teilnehmers as $teilnehmer) {
foreach ($firmenmitglieder as $firmenmitglied) {
if ($firmenmitglied->getId() == $teilnehmer) {
$terminIDs = $request->get('terminIDs');
if ($terminIDs == '-1') {
$terminIDs = null;
}
$empfehlung = $empfehlungenRepository->findOneBy(['user' => $firmenmitglied, 'schulung_id' => $id, 'von_user_id' => $this->getUser()->getId()]);
if ($empfehlung == null) {
$empfehlung = new UserEmpfehlungen();
}
$empfehlung->setUser($firmenmitglied);
$empfehlung->setFirma($this->getUser()->getFirmenProfil());
$empfehlung->setSchulungId($id);
$empfehlung->setVonUserId($this->getUser()->getId());
$empfehlung->setVonUserName($this->getUser()->getUserProfil()->getVorname() . ' ' . $this->getUser()->getUserProfil()->getNachname());
$empfehlung->setDatum($datum);
$empfehlung->setTageAktiv(30);
$empfehlung->setTerminIds($terminIDs);
$entityManager->persist($empfehlung);
$entityManager->flush();
$mailsWarteschleifeController->insertMail([
'preheader' => 'Schulungs-Empfehlung',
'mailempfaenger' => $firmenmitglied->getUserProfil()->getVorname() . ' ' . $firmenmitglied->getUserProfil()->getNachname(),
'empfohlenVon' => $this->getUser()->getUserProfil()->getVorname() . ' ' . $this->getUser()->getUserProfil()->getNachname(),
'firmenname' => $this->getUser()->getFirmenProfil()->getFirmenname(),
'schulung' => $schulung->getId(),
'user' => $firmenmitglied->getId(),
], $_ENV["MAILER_SENDER_NO_REPLY"],
$firmenmitglied->getUserProfil()->getMailversand(),
'handwerkXcampus: Schulungs-Empfehlung',
'emails/schulungen_empfehlung.html.twig',
'Schulungs-Empfehlung', 0,
$firmenmitglied);
$notificationEmpfaenger = [$firmenmitglied->getId()];
$notificationTitle = 'Schulungs-Empfehlung';
$notificationVorschau = $this->getUser()->getFirmenProfil()->getFirmenname() . ' empfielt dir eine Schulung.';
$notificationBody = $this->getUser()->getFirmenProfil()->getFirmenname() . ' empfielt dir eine Schulung.' . chr(10) . 'Empfohlen von ' . $this->getUser()->getUserProfil()->getVorname() . ' ' . $this->getUser()->getUserProfil()->getNachname();
$notificationLink = $_ENV["WEBSITE_URL"] . '/user/firma/startseite/0/empfehlungen';
$firebaseController->firebaseNotificationSenden('dokumente', $notificationEmpfaenger, $notificationTitle, $notificationVorschau, $notificationBody, $notificationLink, $userRepository, $firebaseNotificationRepository, $messaging);
$neueNotification = new UserNotification();
$neueNotification->setUser($firmenmitglied);
$neueNotification->setVonUserId($this->getUser()->getId());
$neueNotification->setUserName($this->getUser()->getuserProfil()->getNachname() . ' ' . $this->getUser()->getuserProfil()->getVorname());
$neueNotification->setType(8);
$neueNotification->setDatum($datum);
$neueNotification->setGelesen(0);
$neueNotification->setText('');
$neueNotification->setLink('' . $empfehlung->getId() . '');
$entityManager->persist($neueNotification);
$entityManager->flush();
}
}
}
}
$returnData["fehlermeldung"] = false;
return new JsonResponse($returnData);
}
#[Route('/user/produkt/favoriten/speichern/{id}', name: 'user_produkt_favoriten_speichern', methods: ['GET'])]
public function favoriten_speichern($id,
UserFavoritenRepository $userFavoritenRepository,
SchulungenRepository $schulungenRepository,
EntityManagerInterface $entityManager): Response
{
$userFavoriten = null;
$userID = $this->getUser()?->getId();
$sessionID = $this->session->getId();
if ($userID == null) {
$userFavoriten = $userFavoritenRepository->findBy(['session_id' => $sessionID, 'schulung' => $id]);
} else {
$userFavoriten = $userFavoritenRepository->findBy(['user_id' => $userID, 'schulung' => $id]);
}
if ($userFavoriten != null) {
foreach ($userFavoriten as $userFavorit) {
$entityManager->remove($userFavorit);
$entityManager->flush();
}
}
$neuerFavorit = new UserFavoriten();
if ($userID == null) {
$neuerFavorit->setUserId(0);
$neuerFavorit->setSessionId($sessionID);
} else {
$neuerFavorit->setUserId($userID);
}
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
if ($schulung != null) {
$neuerFavorit->setSchulung($schulung);
$neuerFavorit->setDatum(new \DateTime('now', new \DateTimeZone('Europe/Berlin')));
$entityManager->persist($neuerFavorit);
$entityManager->flush();
}
$returnData["anzahlFavoriten"] = 1;
$returnData["fehlermeldung"] = false;
return new JsonResponse($returnData);
}
#[Route('/user/produkt/favoriten/loeschen/{id}', name: 'user_produkt_favoriten_loeschen', methods: ['GET'])]
public function favoriten_loeschen($id,
UserFavoritenRepository $userFavoritenRepository,
EntityManagerInterface $entityManager): Response
{
$returnData["anzahlFavoriten"] = -1;
$userFavoriten = null;
$userID = $this->getUser()?->getId();
$sessionID = $this->session->getId();
if ($userID == null) {
$userFavoriten = $userFavoritenRepository->findBy(['session_id' => $sessionID, 'schulung' => $id]);
} else {
$userFavoriten = $userFavoritenRepository->findBy(['user_id' => $userID, 'schulung' => $id]);
$alleFavoriten = count($userFavoritenRepository->findBy(['user_id' => $userID]));
$returnData["anzahlFavoriten"] = $alleFavoriten - 1;
}
if ($userFavoriten != null) {
foreach ($userFavoriten as $userFavorit) {
$entityManager->remove($userFavorit);
$entityManager->flush();
}
}
$returnData["fehlermeldung"] = false;
return new JsonResponse($returnData);
}
#[Route('/user/produkt/details/kommentare/speichern/{id}', name: 'produkt_details_kommentare_speichern', methods: ['POST'])]
public function produkt_details_kommentare_speichern(Request $request, $id,
MailsWarteschleifeController $mailsWarteschleifeController,
FirmenprofilRepository $firmenprofilRepository,
SchulungenRepository $schulungenRepository,
EntityManagerInterface $entityManager): Response
{
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
$firma = $firmenprofilRepository->findOneBy(['id' => $schulung->getErstellerFirmenId()]);
$userID = $this->getUser()?->getId();
$sessionID = $this->session->getId();
$kommentare = new SchulungKommentare();
$kommentare->setSchulung($schulung);
if ($userID == null) {
$kommentare->setUserId(0);
$kommentare->setSessionId($sessionID);
} else {
$kommentare->setUserId($userID);
$kommentare->setSessionId(null);
}
$kommentare->setDatum(new \DateTime('now', new \DateTimeZone('Europe/Berlin')));
$kommentare->setUsername($request->get('name'));
$kommentare->setKommentar($request->get('text'));
$entityManager->persist($kommentare);
$entityManager->flush();
// Mail an den Schulungsanbieter senden
$mailsWarteschleifeController->insertMail([
'preheader' => 'Frage zu einer Schulung - handwerkXcampus',
'art' => 'Frage',
'firmenname' => $firma->getFirmenname(),
'userName' => $request->get('name'),
'text' => $request->get('text'),
'schulung' => $schulung->getId(),
], $_ENV["MAILER_SENDER_NO_REPLY"],
$firma->getAnsprechpartnerEmail(),
'Frage zu einer Schulung - handwerkXcampus',
'emails/schulung_kommentar.html.twig',
'Frage Schulung', 0,
$firma->getFirmaBoss());
$returnData["fehlermeldung"] = false;
return new JsonResponse($returnData);
}
#[Route('/user/produkt/details/kommentare/antwort/speichern/{id}', name: 'produkt_details_kommentare_antwort_speichern', methods: ['POST'])]
public function produkt_details_antwort_speichern(Request $request, $id,
UserRepository $userRepository,
SchulungenRepository $schulungenRepository,
SchulungKommentareRepository $schulungKommentareRepository,
MailsWarteschleifeController $mailsWarteschleifeController,
EntityManagerInterface $entityManager): Response
{
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
$kommentar = $schulungKommentareRepository->findOneBy(['id' => (int)$request->get('kommentarId'), 'schulung' => $schulung]);
$userID = $this->getUser()?->getId();
if ($userID != null && $kommentar != null) {
$userFirmenID = $this->getUser()->getFirmenProfil()?->getId();
if ($userFirmenID == $schulung->getErstellerFirmenId() || in_array("ROLE_CELSEO_MASTERADMIN", $this->getUser()->getRoles())) {
$antwort = new SchulungKommentarAntworten();
$antwort->setKommentar($kommentar);
$antwort->setUserId($userID);
$antwort->setDatum(new \DateTime('now', new \DateTimeZone('Europe/Berlin')));
$antwort->setUsername($this->getUser()->getUserProfil()->getNachname() . ' ' . $this->getUser()->getUserProfil()->getVorname());
$antwort->setAntwort($request->get('antwort'));
$entityManager->persist($antwort);
$entityManager->flush();
if ($kommentar->getUserId() != null) {
$senderUser = $userRepository->findOneBy(['id' => $kommentar->getUserId()]);
if ($senderUser != null) {
$sterneAlt = '';
$sterne = '';
// Mail an den Fragenden senden
$mailsWarteschleifeController->insertMail([
'preheader' => 'Frage wurde beantwortet - handwerkXcampus',
'art' => 'Frage beantwortet',
'firmenname' => $this->getUser()->getUserProfil()->getVorname() . ' ' . $this->getUser()->getUserProfil()->getNachname(),
'userName' => $senderUser->getUserProfil()->getVorname() . ' ' . $senderUser->getUserProfil()->getNachname(),
'sterneAlt' => $sterneAlt,
'sterne' => $sterne,
'textAlt' => $kommentar->getKommentar(),
'text' => $request->get('antwort'),
'schulung' => $schulung->getId(),
], $_ENV["MAILER_SENDER_NO_REPLY"],
$senderUser->getUserProfil()->getMailversand(),
'Frage wurde beantwortet - handwerkXcampus',
'emails/schulung_kommentar.html.twig',
'Frage Schulung', 0,
$senderUser);
}
}
}
}
$returnData["fehlermeldung"] = false;
return new JsonResponse($returnData);
}
#[Route('/user/produkt/details/bewertung/speichern/{id}', name: 'produkt_details_bewertung_speichern', methods: ['POST'])]
public function produkt_details_bewertung_speichern(Request $request, $id,
MailsWarteschleifeController $mailsWarteschleifeController,
FirmenprofilRepository $firmenprofilRepository,
SchulungenRepository $schulungenRepository,
SchulungBewertungenRepository $schulungBewertungenRepository,
EntityManagerInterface $entityManager): Response
{
$userID = $this->getUser()?->getId();
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
$firma = $firmenprofilRepository->findOneBy(['id' => $schulung->getErstellerFirmenId()]);
$sterne = (int)$request->get('sterne');
if ($userID != null && $sterne > 0 && $sterne < 6) {
$sterneAlt = 0;
$textAlt = '';
$bewertung = $schulungBewertungenRepository->findOneBy(['user_id' => $userID, 'schulung' => $schulung]);
if ($bewertung == null) {
$art = 'Bewertung neu';
$bewertung = new SchulungBewertungen();
$bewertung->setSchulung($schulung);
$bewertung->setUserId($userID);
$bewertung->setUsername($request->get('username'));
$bewertung->setEmail($this->getUser()->getUserIdentifier());
$bewertung->setText($request->get('text'));
} else {
$sterneAlt = $bewertung->getSterne();
$textAlt = $bewertung->getText();
$art = 'Bewertung bearbeitet';
$bewertung->setText('<small>--Bewertung wurde bearbeitet--</small><br>' . $request->get('text'));
}
$bewertung->setSterne($sterne);
$bewertung->setDatum(new \DateTime('now', new \DateTimeZone('Europe/Berlin')));
$entityManager->persist($bewertung);
$entityManager->flush();
// Mail an den Schulungsanbieter senden
$mailsWarteschleifeController->insertMail([
'preheader' => 'Schulung wurde bewertet - handwerkXcampus',
'art' => $art,
'firmenname' => $firma->getFirmenname(),
'userName' => $request->get('username'),
'sterneAlt' => $sterneAlt,
'sterne' => $sterne,
'textAlt' => $textAlt,
'text' => $request->get('text'),
'schulung' => $schulung->getId(),
], $_ENV["MAILER_SENDER_NO_REPLY"],
$firma->getAnsprechpartnerEmail(),
'Schulung wurde bewertet - handwerkXcampus',
'emails/schulung_kommentar.html.twig',
'Bewertung Schulung', 0,
$firma->getFirmaBoss());
}
$returnData["fehlermeldung"] = false;
return new JsonResponse($returnData);
}
#[Route('/user/produkt/details/kommentare/{id}', name: 'produkt_details_kommentare')]
public function produkt_details_kommentare(int $id,
UserProfilRepository $userProfilRepository,
SchulungenRepository $schulungenRepository): Response
{
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
$userIDs = [];
$userIDs[] = $schulung->getErstellerUserId();
if (count($schulung->getSchulungKommentare()) > 0) {
foreach ($schulung->getSchulungKommentare() as $kommentare) {
if ($kommentare->getUserId() != null) {
$userIDs[] = $kommentare->getUserId();
}
if (count($kommentare->getAntworten()) > 0) {
foreach ($kommentare->getAntworten() as $antwort) {
$userIDs[] = $antwort->getUserId();
}
}
}
}
return $this->render('user/produkt_details/schulung_kommentare.html.twig', [
'schulung' => $schulung,
'userProfile' => $userProfilRepository->findBy(['user' => $userIDs]),
]);
}
#[Route('/user/produkt/details/bewertungen/{id}', name: 'produkt_details_bewertungen')]
public function produkt_details_bewertungen(int $id,
UserProfilRepository $userProfilRepository,
SchulungenRepository $schulungenRepository): Response
{
$schulung = $schulungenRepository->findOneBy(['id' => $id]);
$userIDs = [];
$sterne = [0, 0, 0, 0, 0];
$anzahlBewertungen = count($schulung->getBewertungen());
$durchschnittBewertungen = 0;
if ($anzahlBewertungen > 0) {
foreach ($schulung->getBewertungen() as $bewertung) {
$userIDs[] = $bewertung->getUserId();
$sterne[$bewertung->getSterne() - 1] = $sterne[$bewertung->getSterne() - 1] + 1;
}
$durchschnittBewertungen = (($sterne[0] * 1) + ($sterne[1] * 2) + ($sterne[2] * 3) + ($sterne[3] * 4) + ($sterne[4] * 5)) / $anzahlBewertungen;
}
return $this->render('user/produkt_details/schulung_bewertungen.html.twig', [
'schulung' => $schulung,
'userProfile' => $userProfilRepository->findBy(['user' => $userIDs]),
'sterne' => $sterne,
'durchschnitt' => $durchschnittBewertungen,
]);
}
#[Route('/user/dozent/{id}', name: 'user_dozent')]
public function user_dozent($id, DozentRepository $dozentRepository,
FirmenprofilRepository $firmenprofilRepository,
UserFavoritenRepository $userFavoritenRepository,
SchulungsTermineRepository $schulungsTermineRepository): Response
{
$userId = $this->getUser()?->getId();
$sessionId = $this->session->getId();
if ($userId == null) {
$favoriten = $userFavoritenRepository->findBy(['session_id' => $sessionId]);
} else {
$favoriten = $userFavoritenRepository->findBy(['user_id' => $userId]);
}
$dozent = $dozentRepository->findOneBy(['user' => $id]);
$termine = $schulungsTermineRepository->findBy(['dozent_user' => $id]);
return $this->render('user/produkt_details/dozent.html.twig', [
'dozent' => $dozent,
'termine' => $termine,
'favoriten' => $favoriten,
'firmenprofile' => $firmenprofilRepository->findAll(),
]);
}
}