<?php
namespace App\Controller\Stock;
use App\Entity\User;
use App\Entity\StockExitSlip;
use App\Entity\StockMovement;
use App\Form\Stock\StockExitSlipType;
use App\Repository\StockExitSlipRepository;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\RegistrationStudentRegistrationRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
/**
* @Route("/stock/exit-slip")
*/
class StockExitSlipController extends AbstractController
{
/**
* @Route("/index", name="stock_exit_slip_index", methods={"GET"})
*/
public function index(Request $request, PaginatorInterface $paginator, StockExitSlipRepository $stockExitSlipRepository): Response
{
$query = $stockExitSlipRepository->createQueryBuilder('s')
->orderBy('s.id', 'DESC')
->getQuery();
$stockExitSlips = $paginator->paginate(
$query,
$request->query->getInt('page', 1),
1000
);
return $this->render('stock/stock_exit_slip/index.html.twig', [
'stock_exit_slips' => $stockExitSlips,
]);
}
/**
* @Route("/new", name="stock_exit_slip_new", methods={"GET","POST"})
*/
public function new(Request $request, StockExitSlipRepository $stockExitSlipRepository): Response
{
/** @var User $user */
$user = $this->getUser();
$establishment = $user->getEstablishment();
$stockExitSlip = new StockExitSlip();
$form = $this->createForm(StockExitSlipType::class, $stockExitSlip);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$exitSlip = $stockExitSlipRepository->findOneBy([
'registrationStudentRegistration' => $stockExitSlip->getRegistrationStudentRegistration(),
'stockProduct' => $stockExitSlip->getStockProduct()
]);
if($exitSlip != null) {
$this->addFlash('warning', 'Un bon de sortie n° '.$exitSlip->getCode().' existe déjà pour cet élève et cet article');
return $this->redirectToRoute('stock_exit_slip_new');
}
$entityManager = $this->getDoctrine()->getManager();
$stockExitSlip->setEstablishment($establishment);
$stockExitSlip->setCode(time());
$entityManager->persist($stockExitSlip);
try {
$entityManager->flush();
$this->addFlash('success', "Traitement effectué");
$stockExitSlip->setCode('BS-'.sprintf('%05d', $stockExitSlip->getId()));
$entityManager->flush();
} catch (\Exception $e) {
$this->addFlash('warning', 'Erreur lors de la création du bon de sortie');
$this->addFlash('info', $e->getMessage());
return $this->redirectToRoute('stock_exit_slip_new');
}
return $this->redirectToRoute('stock_exit_slip_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('stock/stock_exit_slip/new.html.twig', [
'stock_exit_slip' => $stockExitSlip,
'form' => $form,
]);
}
/**
* @Route("/{id}/edit", name="stock_exit_slip_edit", methods={"GET","POST"})
*/
public function edit(Request $request, StockExitSlip $stockExitSlip): Response
{
$form = $this->createForm(StockExitSlipType::class, $stockExitSlip);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
try {
$entityManager->flush();
} catch (\Exception $e) {
$this->addFlash('warning', 'Erreur lors de la modification du bon de sortie');
$this->addFlash('info', $e->getMessage());
}
return $this->redirectToRoute('stock_exit_slip_edit', ['id' => $stockExitSlip->getId()]);
}
return $this->renderForm('stock/stock_exit_slip/edit.html.twig', [
'stock_exit_slip' => $stockExitSlip,
'form' => $form,
]);
}
/**
* @Route("/delete-selection", name="stock_exit_slips_selected_delete", methods={"GET"})
*/
public function deleteSelected(Request $request, StockExitSlipRepository $entityRepository): Response
{
$list = $request->get('entities');
$entityManager = $this->getDoctrine()->getManager();
$errors = 0;
foreach ($list as $key => $id) {
$entity = $entityRepository->findOneBy(['id' => intval($id)], []);
if ($entity != null) {
if (!$entity->getIsValidated()) {
$entityManager->remove($entity);
}
}
}
try {
$entityManager->flush();
$this->addFlash('success', "Traitement effectué");
return $this->json(['code' => 200, 'message' => "Traitement effectué :)"], 200);
} catch (\Throwable $th) {
//$th->getMessage()
$this->addFlash('warning', $th->getMessage());
}
$this->addFlash('warning', "Traitement non effectué");
return $this->json(['code' => 500, 'message' => "Traitement non effectué"], 200);
}
/**
* @Route("/validate/{id}", name="stock_exit_slip_validate", methods={"GET"})
*/
public function validate(StockExitSlip $stockExitSlip): Response
{
$entityManager = $this->getDoctrine()->getManager();
$stockExitSlip->setIsValidated(true);
$stockMovement = new StockMovement();
$stockMovement->setStockExitSlip($stockExitSlip);
$stockMovement->setStockWarehouse($stockExitSlip->getStockWarehouse());
$stockMovement->setStockProduct($stockExitSlip->getStockProduct());
$stockMovement->setQuantity($stockExitSlip->getQuantity());
$stockMovement->setType(StockMovement::TYPE_SORTIE);
$stockMovement->setEstablishment($stockExitSlip->getEstablishment());
$stockMovement->setCreateDate($stockExitSlip->getCreateDate());
$stockMovement->setCode(time());
$entityManager->persist($stockMovement);
try {
$entityManager->flush();
$stockMovement->setCode($stockExitSlip->getCode().'-'.$stockExitSlip->getStockProduct()->getId());
$entityManager->flush();
$this->addFlash('success', "Traitement effectué");
return $this->json(['code' => 200, 'message' => "Traitement effectué :)"], 200);
} catch (\Exception $e) {
$this->addFlash('warning', 'Erreur lors de la validation du bon de sortie');
$this->addFlash('info', $e->getMessage());
}
return $this->json(['code' => 500, 'message' => "Traitement non effectué"], 200);
}
/**
* @Route("/cancel/{id}", name="stock_exit_slip_cancel", methods={"GET"})
*/
public function cancel(StockExitSlip $stockExitSlip): Response
{
$entityManager = $this->getDoctrine()->getManager();
$stockExitSlip->setIsValidated(false);
foreach ($stockExitSlip->getStockMovements() as $stockMovement) {
$entityManager->remove($stockMovement);
}
try {
$entityManager->flush();
$this->addFlash('success', "Traitement effectué");
return $this->json(['code' => 200, 'message' => "Traitement effectué :)"], 200);
} catch (\Exception $e) {
$this->addFlash('warning', 'Erreur lors de la suppression du bon de sortie');
$this->addFlash('info', $e->getMessage());
}
return $this->json(['code' => 500, 'message' => "Traitement non effectué"], 200);
}
}