<?php
namespace App\Controller;
use App\Entity\Calculator;
use App\Entity\Imposition;
use App\Entity\Machine;
use App\Entity\PaperSize;
use App\Entity\Product;
use App\Entity\Task;
use App\Form\CalculatorSettingsType;
use App\Form\CalculatorType;
use App\Repository\CalculatorRepository;
use App\Repository\ImpositionRepository;
use App\Repository\MachineRepository;
use App\Repository\PaperSizeRepository;
use App\Repository\ProductRepository;
use App\Repository\TaskRepository;
use App\Service\BusinessCardCalculator;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
/**
* @Route("/admin/calculator")
*/
class CalculatorController extends AbstractController
{
/**
* @Route("/", name="calculator_index")
*/
public function index(CalculatorRepository $calculatorRepository,
PaginatorInterface $paginator,Request $request,
EntityManagerInterface $em
): Response
{
//$queryParams = $this->get_params_from_search_query($request);
$name = trim($request->query->get('name'));
$query = $calculatorRepository->findBySearchQuery($name);
//$product = $query->getResult();
//$products = $productRepository->findAll();
$pagination = $paginator->paginate(
$query, /* query NOT result */
$request->query->getInt('page', 1), /*page number*/
20, /*limit per page*/
[
'defaultSortFieldName' => 'c.createdAt',
'defaultSortDirection' => 'desc'
]
);
return $this->render('calculator/index.html.twig', [
'pagination' => $pagination
]);
}
/**
* @Route("/new", name="calculator_new", methods={"GET", "POST"})
*/
public function new(Request $request, CalculatorRepository $calculatorRepository): Response
{
$calculator = new Calculator();
$form = $this->createForm(CalculatorType::class, $calculator);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$calculatorRepository->add($calculator, true);
return $this->redirectToRoute('app_calculator_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('calculator/new.html.twig', [
'calculator' => $calculator,
'form' => $form,
]);
}
/**
* @Route("/get_printing_types", name="calculator_get_printing_types", methods={"GET"}, options={"expose"=true})
*/
public function getPrintingTypes(Request $request, MachineRepository $machineRepository): Response
{
$query = $request->query->get('q', '');
$machines = $machineRepository->findPrintingTypesByNameOrCode($query);
$results = [];
foreach ($machines as $machine) {
/* @var $machine Machine */
$results['results'][] = [
'id' => htmlspecialchars($machine->getId(), \ENT_COMPAT | \ENT_HTML5),
'text' => htmlspecialchars('[' . $machine->getCode() . '] ' . $machine->getName(),
\ENT_COMPAT | \ENT_HTML5)
];
}
return $this->json($results);
}
/**
* @Route("/get_machines", name="calculator_get_machines", methods={"GET"}, options={"expose"=true})
*/
public function getMachines(Request $request, MachineRepository $machineRepository): Response
{
$query = $request->query->get('q', '');
$printingTypeId = $request->query->get('machine_id', '');
$parentMachine = $machineRepository->find($printingTypeId);
$machines = $machineRepository->findMachinesByNameOrCode($query, $parentMachine);
$results = [];
foreach ($machines as $machine) {
/* @var Machine $machine */
$results['results'][] = [
'id' => htmlspecialchars($machine->getId(), \ENT_COMPAT | \ENT_HTML5),
'text' => htmlspecialchars('[' . $machine->getCode() . '] ' . $machine->getName(),
\ENT_COMPAT | \ENT_HTML5)
];
}
return $this->json($results);
}
/**
* @Route("/get_machine_paper/{machine_id}", name="calculator_get_machine_paper", methods={"GET"}, options={"expose"=true})
* @ParamConverter("machine", options={"id" = "machine_id"})
*/public function get_machine_papers(Request $request, Machine $machine): Response
{
$results = [];
$paperSizes = $machine->getPaperSizes()->toArray();
foreach ($paperSizes as $paperSize){
/* @var PaperSize $paperSize */
$results['results'][] = [
'id' => htmlspecialchars($paperSize->getId(), \ENT_COMPAT | \ENT_HTML5),
'text' => htmlspecialchars('[' . $paperSize->getCode() . '] ' . $paperSize->getName(),
\ENT_COMPAT | \ENT_HTML5)
];
}
return $this->json($results, 200,
[],
[
'groups' => ['machine']
]);
}
/**
* @Route("/get_imposition", name="calculator_get_imposition", methods={"GET"}, options={"expose"=true})
*/
public function get_imposition(Request $request, ImpositionRepository $impositionRepository): Response
{
$results = [];
$query = $request->query->get('q', '');
$finishedSizeX = $request->query->get('finished_size_x');
$finishedSizeY = $request->query->get('finished_size_y');
$impositions = $impositionRepository->findBy([
'impositionAcross' => $finishedSizeX,
'impositionDown' => $finishedSizeY,
]);
foreach ($impositions as $imposition){
/* @var Imposition $imposition */
$results['results'][] = [
'id' => htmlspecialchars($imposition->getId(), \ENT_COMPAT | \ENT_HTML5),
'text' => htmlspecialchars($imposition->getName(),
\ENT_COMPAT | \ENT_HTML5)
];
}
return $this->json($results);
}
/**
* @Route("/get_paper_type", name="calculator_get_paper_type", methods={"GET"}, options={"expose"=true})
*/
public function get_paper_type(Request $request, PaperSizeRepository $paperSizeRepository, ProductRepository $productRepository): Response
{
$results = [];
$paperSizeId = $request->query->get('paper_size_id');
$query = $request->query->get('q', '');
$paperSize = $paperSizeRepository->find($paperSizeId);
if ($paperSize){
$products = $productRepository->findPapersBySize($query, $paperSize->getWidth(), $paperSize->getHeight());
foreach ($products as $product){
/* @var Product $product */
$results['results'][] = [
'id' => htmlspecialchars($product->getId(), \ENT_COMPAT | \ENT_HTML5),
'text' => htmlspecialchars($product->getGsm().'gsm '.$product->getName().' '.$product->getDescription(),
\ENT_COMPAT | \ENT_HTML5)
];
}
}
return $this->json($results);
}
/**
* @Route("/get_task", methods="GET", name="calculator_get_task", options={"expose"=true})
*/
public function get_task(Request $request, TaskRepository $taskRepository): JsonResponse
{
$query = $request->query->get('q', '');
$tasks = $taskRepository->findByNameOrCode($query);
$results = [];
foreach ($tasks as $task) {
/* @var $task Task */
$results['results'][] = [
'id' => htmlspecialchars($task->getId(), \ENT_COMPAT | \ENT_HTML5),
'text' => htmlspecialchars('[' . $task->getCode() . '] ' . $task->getName(),
\ENT_COMPAT | \ENT_HTML5),
'name'=> $task->getName(),
'code'=> $task->getCode(),
'invoice_description' => $task->getInvoiceDescription(),
'technical_notes' => $task->getTechnicalNotes()
];
}
return $this->json($results);
}
/**
* @Route("/{id}", name="app_calculator_show", methods={"GET"})
*/
public function show(Calculator $calculator): Response
{
return $this->render('calculator/show.html.twig', [
'calculator' => $calculator,
]);
}
/**
* @Route("/{id}/edit", name="calculator_edit", methods={"GET", "POST"})
*/
public function edit(Request $request, Calculator $calculator, CalculatorRepository $calculatorRepository): Response
{
$form = $this->createForm(CalculatorType::class, $calculator);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//$calculatorRepository->add($calculator, true);
return $this->redirectToRoute('calculator_index', [], Response::HTTP_SEE_OTHER);
}
$template = $calculator->getTemplate();
return $this->renderForm(empty($template)?'calculator/edit.html.twig':'calculator/'.$template, [
'calculator' => $calculator,
'form' => $form,
]);
}
/**
* @Route("/{id}", name="calculator_delete", methods={"POST"})
*/
public function delete(Request $request, Calculator $calculator, CalculatorRepository $calculatorRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$calculator->getId(), $request->request->get('_token'))) {
$calculatorRepository->remove($calculator, true);
}
return $this->redirectToRoute('calculator_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @Route("/{id}/settings", name="calculator_settings", methods={"GET", "POST"})
*/
public function settings(Request $request, Calculator $calculator, CalculatorRepository $calculatorRepository): Response
{
$form = $this->createForm(CalculatorSettingsType::class, $calculator);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$calculatorRepository->add($calculator, true);
$this->addFlash('success', 'Calculator updated.');
return $this->redirectToRoute('calculator_settings', ['id' => $calculator->getId()], Response::HTTP_SEE_OTHER);
}
$template = $calculator->getTemplate();
return $this->renderForm('calculator/settings.html.twig', [
'calculator' => $calculator,
'form' => $form,
]);
}
/**
* @Route("/{id}/calculate", name="calculate", methods={"POST"})
*/
public function calculate(Request $request, Calculator $calculator, BusinessCardCalculator $calculatorHelper
): Response
{
$result = [];
//Get all data
$data = $request->request->all();
//Business card
if ($calculator->getId() == 1 ){
$result = $calculatorHelper->getPricing($data, $calculator);
return $this->json([
'result' => $result,
'html' => $this->renderView('calculator/business_card_calculator_result.html.twig', [
'pricing' => $result
])
]);
}
return $this->json($result);
}
}