<?php
namespace JF\JuridicusBundle\Controller;
use JMS\DiExtraBundle\Annotation as DI;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use JF\JuridicusBundle\Form\AboType;
use JF\JuridicusBundle\Entity\Abo;
use JF\JuridicusBundle\Entity\AboZeitraum;
use JF\JuridicusBundle\Form\LockaboType;
use JF\JuridicusBundle\Repository\PdfZeitschriftZARepository;
use JF\JuridicusBundle\Services\AboManager;
/**
*
*/
class ZAController extends BaseController
{
/**
* @DI\Inject("jf_juridicus.za_repository")
*
* @var PdfZeitschriftZARepository
*/
protected $repo;
/**
* @DI\Inject("jf_juridicus.abo_manager")
*
* @var AboManager
*/
protected $aboManager;
/**
* @Route("/ZA/", name="za_main")
*/
public function showAction()
{
/* Felix Baltes, Zeitschriften entfernen, 2017-06 za_konzept */
return $this->redirect($this->generateUrl('za_archiv'));
}
/**
* @Route("/ZA/konzept.html", name="za_konzept")
*/
public function showKonzeptAction()
{
/* Felix Baltes, Zeitschriften entfernen, 2017-06 */
return $this->redirect($this->generateUrl('za_main'));
/*
$response = $this->render('JFJuridicusBundle:ZA:konzept.html.twig');
$response->setETag(md5($response->getContent()));
$response->isNotModified($this->getRequest());
return $response;
*/
}
/**
* @Route("/ZA/bezugspreise.html", name="za_bezugspreise")
*/
public function showBezugspreiseAction()
{
/* Felix Baltes, Zeitschriften entfernen, 2017-06 */
return $this->redirect($this->generateUrl('za_main'));
/*
$response = $this->render('JFJuridicusBundle:ZA:bezugspreise.html.twig');
$response->setETag(md5($response->getContent()));
$response->isNotModified($this->getRequest());
return $response;
*/
}
/**
* @Route("/sponsor", name="za_bezugspreise_sponsor")
*/
public function showBezugspreiseSponsoredAction()
{
/* Felix Baltes, Zeitschriften entfernen, 2017-06 */
return $this->redirect($this->generateUrl('za_main'));
/*
$response = $this->render('JFJuridicusBundle:ZA:bezugspreise_sponsor.html.twig');
$response->setETag(md5($response->getContent()));
$response->isNotModified($this->getRequest());
return $response;
*/
}
/**
* @Route("/ZA/leseprobe.html", name="za_leseprobe")
*/
public function showLeseprobeAction()
{
/* Felix Baltes, Zeitschriften entfernen, 2017-06 */
return $this->redirect($this->generateUrl('za_main'));
/*
$response = $this->render('JFJuridicusBundle:ZA:leseprobe.html.twig');
$response->setETag(md5($response->getContent()));
$response->isNotModified($this->getRequest());
return $response;
*/
}
/**
* @Route("/ZA/Leseprobe_ZA.pdf", name="za_leseprobe_pdf")
*/
public function leseprobePdfAction()
{
// letzte ZA aus dem Archiv
$pdf = $this->repo->findLastBefore(new \DateTime('today - 6 months'));
if (!$pdf) {
throw $this->createNotFoundException();
}
return $pdf->createResponse(true);
}
/**
* bestellscheinAction
* URL existiert nicht mehr
*
* @Route("/ZA/Bestellung", name="za_bestellschein")
*/
public function bestellscheinAction()
{
return new Response('', 410);
$datumStartOnline = $this->getDefaultStartDatumOnline();
$abo = new Abo();
$abo
->setVorzugspreis(false)
->setDatumStart($datumStartOnline)
;
$form = $this->createForm(AboType::class, $abo, array(
'em' => $this->getDoctrine()->getManager()
));
return $this->render('@JFJuridicusBundle/ZA/bestellschein.html.twig', array(
'form' => $form->createView(),
'default_date_online' => $datumStartOnline
));
}
/**
* sponsorBestellscheinAction
* URL existiert nicht mehr
*
* @Route("/sponsor/ZA/Bestellung", name="za_bestellschein_sponsor")
*/
public function sponsorBestellscheinAction()
{
return new Response('', 410);
$datumStartOnline = $this->getDefaultStartDatumOnline();
$abo = new Abo();
$abo
->setVorzugspreis(true)
->setDatumStart($datumStartOnline)
;
$form = $this->createForm(AboType::class, $abo, array(
'em' => $this->getDoctrine()->getManager()
));
return $this->render('@JFJuridicusBundle/ZA/bestellschein.html.twig', array(
'form' => $form->createView(),
'default_date_online' => $datumStartOnline
));
}
/**
* createBestellungAction
* URL existiert nicht mehr
*
* @Route("/ZA/Bestellung/create", name="za_bestellung_create")
* @Method({"POST"})
*/
public function createBestellungAction(Request $request)
{
return new Response('', 410);
$em = $this->getDoctrine()->getManager();
$abo = new Abo();
$abo
->setZeitschrift('ZA')
->setIp($request->getClientIp())
;
$form = $this->createForm(AboType::class, $abo, array('em' => $em));
$form->handleRequest($request); //changedFrom
if ($form->isValid()) {
$em->getConnection()->beginTransaction();
$abo->calculateDatumEnde();
// speichern, um eine Abo-Id zu gewährleisten
$em->persist($abo);
$em->flush();
$this->get('session')->set('abo_id', $abo->getId());
// ersten Abo-Zeitraum hinzufügen
$aboZeitraum = $this->aboManager->createRestrictedAboZeitraum($abo);
$aboAusgaben = $this->aboManager->createAboAusgaben($aboZeitraum);
$this->aboManager->sendAboZeitschriften($aboZeitraum);
if ($abo->getTyp() === Abo::ABO_FULL) {
// bei Vollabos ggfs auch zweiten Abo-Zeitraum, falls Jahresgrenze überschritten wird
$januaryFirst = new \DateTime('first day of january this year 00:00:00');
if ($abo->getDatumStart() < $januaryFirst) {
// zweiten Abo-Zeitraum hinzufügen
$decemberLast = new \DateTime('last day of december this year 00:00:00');
$aboZeitraum2 = $this->aboManager->createRestrictedAboZeitraum($abo, $januaryFirst, $decemberLast);
$aboAusgaben2 = $this->aboManager->createAboAusgaben($aboZeitraum2);
$this->aboManager->sendAboZeitschriften($aboZeitraum2);
}
}
$em->flush();
$em->getConnection()->commit();
return $this->redirect($this->generateUrl('za_bestellung_create_success'));
}
return $this->render('@JFJuridicusBundle/ZA/bestellschein.html.twig', array(
'form' => $form->createView(),
'default_date_online' => $this->getDefaultStartDatumOnline(),
));
}
/**
* createLockBestellungAction
* URL existiert nicht mehr
*
* @Method({"POST"})
*/
public function createLockBestellungAction(Request $request)
{
$this->denyAccessUnlessGranted('ROLE_KUNDE');
return new Response('', 410);
$em = $this->getDoctrine()->getManager();
$kunde = $this->getKunde();
$datumStart = $this->getDefaultStartDatumOnline();
$abo = new Abo();
$abo
->setZeitschrift('ZA')
->setOnline(true)
->setTyp(Abo::ABO_LOCKABO_6)
->setIp($request->getClientIp())
->setDatumStart($datumStart)
->setKunde($kunde)
->setVorname($kunde->getVorname())
->setNachname($kunde->getNachname())
->setStrasse($kunde->getStrasse())
->setHausnummer($kunde->getHausnummer())
->setPlz($kunde->getPlz())
->setOrt($kunde->getOrt())
->setGeburtsdatum($kunde->getGeburtsdatum())
->setEmail($kunde->getEmail())
->setTelefon($kunde->getHandynummer())
;
$form = $this->createForm(LockaboType::class, array(), array());
$form->handleRequest($request); //changedFrom bind
if ($form->isValid()) {
$em->getConnection()->beginTransaction();
$abo->calculateDatumEnde();
// speichern, um eine Abo-Id zu gewährleisten
$em->persist($abo);
$em->flush();
$this->get('session')->set('abo_id', $abo->getId());
$aboZeitraum = $this->aboManager->createRestrictedAboZeitraum($abo);
$aboAusgaben = $this->aboManager->createAboAusgaben($aboZeitraum);
$this->aboManager->sendAboZeitschriften($aboZeitraum);
$em->flush();
$em->getConnection()->commit();
return $this->redirect($this->generateUrl('za_bestellung_create_success'));
}
return $this->redirect($this->generateUrl('homepage'));
}
/**
* createBestellungSuccessAction
* URL existiert nicht mehr
*
* @Route("/ZA/Bestellung/success", name="za_bestellung_create_success")
*/
public function createBestellungSuccessAction()
{
$session = $this->get('session');
$abo_id = $session->get('abo_id');
$session->remove('abo_id');
if (!$abo_id) {
return $this->redirect($this->generateUrl('homepage'));
}
$em = $this->getDoctrine()->getManager();
$abo = $em->getRepository('JFJuridicusBundle:Abo')->find($abo_id);
$content = $this->renderView(
'JFJuridicusBundle:Abo:show.html.twig',
array('abo' => $abo)
);
$mailer = $this->get('jf_juridicus.system_mailer');
$message = \Swift_Message::newInstance()
->setSubject('Systemnachricht: Neues ZA Abo')
->setBody($content, 'text/html')
;
$mailer->send($message);
return $this->render('@JFJuridicusBundle/ZA/bestellschein_success.html.twig', array(
'abo' => $abo
));
}
/**
* bestellscheinPdfAction
* URL existiert nicht mehr
*
* @Route("/ZA/ZA-Bestellung.pdf", name="za_bestellschein_pdf")
*/
public function bestellscheinPdfAction()
{
return new Response('', 410);
}
/**
* @Route("/ZA/archiv", name="za_archiv")
*/
public function archivAction(PdfZeitschriftZARepository $repo)
{
// alles holen, was älter als 6 Monate ist
$byYear = $repo->findArchivSince(new \DateTime('today - 6 months'));
return $this->render('@JFJuridicusBundle/ZA/archiv.html.twig', array(
'entities_by_year' => $byYear
));
}
/**
* @Route("/ZA/{date}.pdf", name="za_download")
* @ParamConverter("date", options={"format": "d-m-Y"})
*/
public function downloadAction(\DateTime $date, PdfZeitschriftZARepository $repo)
{
$pdf = $repo->findOneBy(array('released_at' => $date));
if (!$pdf) {
throw $this->createNotFoundException('Die Zeitschrift wurde nicht gefunden');
}
// check Download Permissions
$restrict_date = new \DateTime('today -6 months');
if ($date < $restrict_date) {
// Archiv-Zeitschriften (älter als 6 Monate) immer erlaubt
return $pdf->createResponse(true);
}
$user = $this->getUser();
if (!$user) {
throw $this->createAccessDeniedException();
}
/* @var $kunde \JF\JuridicusBundle\Entity\Kunde */
$kunde = $user->getKunde();
if (!$kunde) {
throw $this->createAccessDeniedException();
}
$pruefungsamt = $kunde->getPruefungsamt();
if (!$pruefungsamt) {
throw $this->createAccessDeniedException();
}
// Bei Vollbestand zum Registrierungszeitpunkt nur Zugriff für Kunden,
// die den Export erlaubt haben
if ($pruefungsamt->hasVollbestand($kunde->getCreatedAt()) && !$kunde->getExportErlaubt()) {
throw $this->createAccessDeniedException();
}
// letzten 3 Ausgaben anhand des letzten Buchungsdatums bestimmen
$allowed_entities = $this->repo->findThreeBefore($kunde->getZAStichtag());
foreach ($allowed_entities as $allowed_entity) {
if ($allowed_entity->getId() == $pdf->getId()) {
return $pdf->createResponse(true);
}
}
throw $this->createAccessDeniedException();
}
/**
* @return \DateTime
*/
protected function getDefaultStartDatumOnline()
{
$datumLastRelease = $this->repo->findLast()->getReleasedAt();
$datumStart = new \DateTime('first day of this month 00:00:00');
if ($datumLastRelease < $datumStart) {
$datumStart->modify('-1 month');
}
return $datumStart;
}
}