<?php
namespace App\Daikin\FrontendBundle\Controller\Admin;
use App\Daikin\BaseBundle\Controller\AbstractDaikinBaseController;
use App\Daikin\BaseBundle\Entity\EmergencyStock\Warehouse;
use App\Daikin\BaseBundle\Entity\SparePartsModel;
use App\Daikin\BaseBundle\Entity\SparePartsNumber;
use App\Daikin\BaseBundle\Entity\SparePartsPart;
use App\Daikin\FrontendBundle\Form\Type\Admin\SparePartsPartType;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use EHC\PagerBundle\Service\PagerService;
use Exception;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/notfalllager-parts-admin")
*
* Class SparePartsController
* @package App\Daikin\FrontendBundle\Controller
* @Security("is_granted('OWNMODULE', 'nfl') and is_granted('ROLE_SPARE_PARTS_PARTS_ADMIN')")
*/
class SparePartsAdminController extends AbstractDaikinBaseController
{
/**
* @Route("/", name="spare_parts_admin_index", methods={"GET"})
*
* @param PagerService $pager
* @param TranslatorInterface $translator
* @param ParameterBagInterface $parameterBag
* @return Response
* @throws NoResultException
* @throws NonUniqueResultException
* @throws Exception
*/
public function index(PagerService $pager, TranslatorInterface $translator, ParameterBagInterface $parameterBag): Response
{
$models = $this->em->getRepository(SparePartsModel::class)->findAll();
$modelChoices = [];
foreach ($models as $model) {
$modelChoices[$model->getId()] = $model->getName();
}
$warehouses = $this->em->getRepository(Warehouse::class)->findAll();
$warehouseChoices = [];
foreach ($warehouses as $warehouse) {
$warehouseChoices[$warehouse->getId()] = $warehouse->getLocationName();
}
$pager
->setEntity(SparePartsPart::class, 'spart', 20)
// ->addFilter( 'partmodels.name', 'like', array( 'label' => $translator->trans('Model') ) )
->addFilter( 'pmd.model', 'choice', ['label' => 'Modell', 'choices' => $modelChoices])
->addFilter( 'partNumbers.number', 'like', array( 'label' => $translator->trans('Main part number') ) )
->addFilter( 'pmd.design', 'like', array( 'label' => $translator->trans('Design') ) )
->addFilter( 'pmd.circuitDiagram', 'like', array( 'label' => $translator->trans('Circuit diagram') ) )
->addFilter( 'pwh.warehouse', 'choice', ['label' => 'Lager', 'choices' => $warehouseChoices])
->addFilter( 'spart.name', 'like', array( 'label' => $translator->trans('Part name') ) )
->addJoin('spart.partNumbers', 'partNumbers', true)
->addJoin('spart.partModelDetails', 'pmd', true)
->addJoin('spart.partsWarehouses', 'pwh', true)
->addSortable('id', 'ASC')
->addSortables(['partNumbers.number', 'partmodel.name', 'name', 'createdAt', 'updatedAt', 'pmd.model'])
->setGroupBy('spart.id')
->setElementTemplate('@DaikinFrontend/admin/sparePartsAdmin/part_table_row.html.twig');
return $this->render('@DaikinFrontend/admin/sparePartsAdmin/index.html.twig', [
'pager' => $pager->getInstance()->getPagerResult(),
]);
}
/**
* @Route("/create", name="spare_parts_admin_create", methods={"GET", "POST"})
*
* @param Request $request
* @return Response
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function create(Request $request): Response
{
$sparePart = new SparePartsPart();
$form = $this->createForm(SparePartsPartType::class, $sparePart);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$mainPartNumber = $form->get('mainPartNumberValue')->getData();
try {
foreach ($sparePart->getPartNumbers() as $number) {
if ($number->getNumber() == $mainPartNumber) {
$sparePart->setMainPartNumber($number);
}
}
$this->em->persist($sparePart);
$this->em->flush();
return $this->redirectToRoute('spare_parts_admin_index');
// FIXME 54
} catch (UniqueConstraintViolationException $e) {
// if ($this->container->get('kernel')->isDebug()) {
// $this->addFlash('error', $e->getMessage());
// }
$this->addFlash('error', 'Bitte prüfen Sie Ihre Eingaben. Entweder ist Ihre Teilenummer schon vergeben oder pro Modell wurden mehrere Baujahr Einträge hinzugefügt.');
}
}
return $this->render('@DaikinFrontend/admin/sparePartsAdmin/create.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/edit/{id}", name="spare_parts_admin_edit", methods={"GET", "POST"})
*
* @param Request $request
* @param SparePartsPart $sparePart
*
* @return Response
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function edit(Request $request, SparePartsPart $sparePart): Response
{
$originalNumbers = new ArrayCollection();
foreach ($sparePart->getPartNumbers() as $num) {
$originalNumbers->add($num);
}
$originalWarehouses = new ArrayCollection();
foreach ($sparePart->getPartsWarehouses() as $wh) {
$originalWarehouses->add($wh);
}
$form = $this->createForm(SparePartsPartType::class, $sparePart);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->em;
try {
$mainPartNumber = $em->getRepository(SparePartsNumber::class)
->findOneBy(['number' => $form->get('mainPartNumberValue')->getData()]);
if ($mainPartNumber) {
$sparePart->setMainPartNumber($mainPartNumber);
}
foreach ($originalNumbers as $number) {
if (false === $sparePart->getPartNumbers()->contains($number)) {
$sparePart->getPartNumbers()->removeElement($number);
$em->remove($number);
}
}
foreach ($originalWarehouses as $originalWarehouse) {
if (false === $sparePart->getPartsWarehouses()->contains($originalWarehouse)) {
$sparePart->getPartsWarehouses()->removeElement($originalWarehouse);
$em->remove($originalWarehouse);
}
}
$em->persist($sparePart);
$em->flush();
return $this->redirectToRoute('spare_parts_admin_index');
// FIXME 54
}catch (UniqueConstraintViolationException $e) {
// if ($this->container->get('kernel')->isDebug()) {
// $this->addFlash('error', $e->getMessage());
// }
$this->addFlash('error', 'Bitte prüfen Sie Ihre Eingaben. Entweder ist Ihre Teilenummer schon vergeben oder pro Modell wurden mehrere Baujahr Einträge hinzugefügt.');
}
}
return $this->render('@DaikinFrontend/admin/sparePartsAdmin/create.html.twig', [
'form' => $form->createView(),
'sparePart' => $sparePart
]);
}
/**
* @Route("/show/{id}", name="spare_parts_admin_show", methods={"GET"})
*
* @param SparePartsPart $sparePart
*
* @return Response
*/
public function show(SparePartsPart $sparePart): Response
{
return $this->render('@DaikinFrontend/admin/sparePartsAdmin/show.html.twig', [
'part' => $sparePart
]);
}
/**
* @Route("/delete/{id}", name="spare_parts_admin_delete", methods={"GET"})
* @Security("is_granted('ROLE_SPARE_PARTS_PARTS_ADMIN')")
*
* @param SparePartsPart $sparePart
*
* @return RedirectResponse
*/
public function deleteAction(SparePartsPart $sparePart): Response
{
$sparePart->setDeleted(true);
$this->em->persist($sparePart);
$this->em->flush();
return $this->redirectToRoute('spare_parts_admin_index');
}
/**
* @Route("/undelete/{id}", name="spare_parts_admin_undelete", methods={"GET"})
* @Security("is_granted('ROLE_SPARE_PARTS_FULLADMIN')")
*
* @param SparePartsPart $sparePart
*
* @return RedirectResponse
*/
public function undeleteAction(SparePartsPart $sparePart): Response
{
if ( $this->recoverEntity($sparePart) ) {
$this->em->flush();
}
return $this->redirectToRoute('spare_parts_admin_index');
}
/**
* @Route("/full_delete/{id}", name="spare_parts_admin_full_delete", methods={"GET"})
* @Security("is_granted('ROLE_SPARE_PARTS_FULLADMIN')")
*
* @param SparePartsPart $sparePart
*
* @return RedirectResponse
*/
public function fullDeleteAction(SparePartsPart $sparePart): Response
{
$sparePart->setMainPartNumber(null);
foreach ($sparePart->getPartNumbers() as $number) {
$this->em->remove($number);
}
$this->em->flush();
$this->em->remove($sparePart);
$this->em->flush();
return $this->redirectToRoute('spare_parts_admin_index');
}
}