src/Nolimit/Offer/Controller/OfferAdminController.php line 279

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Nolimit\Offer\Controller;
  4. use App\Entity\Project;
  5. use App\Entity\ProjectStatus;
  6. use App\Nolimit\Offer\Manager\OfferManager;
  7. use App\Nolimit\Offer\Persister\OfferBodyPersister;
  8. use App\Nolimit\Offer\Persister\OfferPersister;
  9. use App\Nolimit\Offer\Provider\OfferDatatableProvider;
  10. use App\Nolimit\Pdf\PdfGenerator;
  11. use App\Repository\CurrencyRepository;
  12. use App\Repository\LanguageRepository;
  13. use App\Repository\OfferBodyRepository;
  14. use App\Repository\OfferRepository;
  15. use App\Repository\OfferStatusRepository;
  16. use App\Repository\ProjectRepository;
  17. use App\Repository\TaskRepository;
  18. use Doctrine\DBAL\Driver\Exception;
  19. use Doctrine\ORM\EntityManagerInterface;
  20. use Sonata\AdminBundle\Controller\CRUDController;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  26. use Symfony\Contracts\Translation\TranslatorInterface;
  27. class OfferAdminController extends CRUDController
  28. {
  29.     private EntityManagerInterface $entityManager;
  30.     private OfferDatatableProvider $datatableProvider;
  31.     private OfferRepository $offerRepository;
  32.     private TranslatorInterface $translator;
  33.     private OfferManager $offerManager;
  34.     private OfferBodyRepository $offerBodyRepository;
  35.     private OfferStatusRepository $offerStatusRepository;
  36.     private CurrencyRepository $currencyRepository;
  37.     private ProjectRepository $projectRepository;
  38.     private OfferBodyPersister $offerBodyPersister;
  39.     private OfferPersister $offerPersister;
  40.     private PdfGenerator $pdfGenerator;
  41.     private LanguageRepository $languageRepository;
  42.     private TokenStorageInterface $tokenStorage;
  43.     private TaskRepository $taskRepository;
  44.     public function __construct(EntityManagerInterface $entityManagerOfferDatatableProvider $datatableProviderOfferRepository $offerRepositoryTranslatorInterface $translatorOfferManager $offerManagerOfferBodyRepository $offerBodyRepositoryOfferStatusRepository $offerStatusRepositoryCurrencyRepository $currencyRepositoryProjectRepository $projectRepositoryOfferBodyPersister $offerBodyPersisterOfferPersister $offerPersister,PdfGenerator $pdfGeneratorLanguageRepository $languageRepositoryTokenStorageInterface $tokenStorageTaskRepository $taskRepository)
  45.     {
  46.         $this->entityManager $entityManager;
  47.         $this->datatableProvider $datatableProvider;
  48.         $this->offerRepository $offerRepository;
  49.         $this->translator $translator;
  50.         $this->offerManager $offerManager;
  51.         $this->offerBodyRepository $offerBodyRepository;
  52.         $this->offerStatusRepository $offerStatusRepository;
  53.         $this->currencyRepository $currencyRepository;
  54.         $this->projectRepository $projectRepository;
  55.         $this->offerBodyPersister $offerBodyPersister;
  56.         $this->offerPersister $offerPersister;
  57.         $this->pdfGenerator $pdfGenerator;
  58.         $this->languageRepository $languageRepository;
  59.         $this->tokenStorage $tokenStorage;
  60.         $this->taskRepository $taskRepository;
  61.     }
  62.     public function listAction(Request $request): Response
  63.     {
  64.         $user $this->tokenStorage->getToken()->getUser();
  65.         $isSuperAdmin in_array("ROLE_SUPER_ADMIN"$user->getRoles());
  66.         return $this->renderWithExtraParams('/offer/offer_view.html.twig', array(
  67.             'is_super_admin' => $isSuperAdmin
  68.         ));
  69.     }
  70.     /**
  71.      * @Route("/admin/app/offer/offer_list", name="offer_list", methods={"POST"} )
  72.      */
  73.     public function offerListAction(): Response
  74.     {
  75.         $adata['data'] = $this->datatableProvider->datatable();
  76.         return $this->json($adata);
  77.     }
  78.     /**
  79.      * @Route("/admin/app/offer/offer_new_row", name="offer_new_row", methods={"POST"} )
  80.      */
  81.     public function offerNewRowAction(Request $request): Response
  82.     {
  83.         $id $request->get('id');
  84.         $offer $this->offerRepository->find($id);
  85.         $lastOrderNumber=$this->offerBodyRepository->getBiggestOrderOfferBody($offer->getId());
  86.         $user $this->tokenStorage->getToken()->getUser();
  87.         $isSuperAdmin in_array("ROLE_SUPER_ADMIN"$user->getRoles());
  88.         return $this->renderWithExtraParams('/offer/offer_new_row.html.twig', array(
  89.             'offer' => $offer,
  90.             'title' => $this->translator->trans('Add offer new row'),
  91.             'edited' => false,
  92.             'lastOrder'=>$lastOrderNumber,
  93.             'is_super_admin'=>$isSuperAdmin,
  94.             'tasks' => $this->formatTasksForOfferSelect($offer),
  95.             'selectedTaskId' => 0,
  96.             'linkedTaskWorkedTime' => '',
  97.         ));
  98.     }
  99.     /**
  100.      * @Route("/admin/app/offer/offer_edit_row", name="offer_edit_row", methods={"POST"} )
  101.      */
  102.     public function offerEditRowAction(Request $request): Response
  103.     {
  104.         $id $request->get('id');
  105.         $offerBody $this->offerBodyRepository->find($id);
  106.         $lastOrderNumber=$this->offerBodyRepository->getBiggestOrderOfferBody($offerBody->getOffer()->getId());
  107.         $user $this->tokenStorage->getToken()->getUser();
  108.         $isSuperAdmin in_array("ROLE_SUPER_ADMIN"$user->getRoles());
  109.         $linkedTask $this->taskRepository->findOneBy(['offerBody' => $offerBody->getId()]);
  110.         $linkedTaskWorkedTime $linkedTask $this->formatWorkedMinutes((int)($linkedTask->getWorkedMinutes() ?? 0)) : '';
  111.         return $this->renderWithExtraParams('/offer/offer_new_row.html.twig', array(
  112.             'offer' => $offerBody->getOffer(),
  113.             'offerBody' => $offerBody,
  114.             'title' => $this->translator->trans('Edit offer row'),
  115.             'edited' => false,
  116.             'lastOrder'=>$lastOrderNumber,
  117.             'is_super_admin'=>$isSuperAdmin,
  118.             'tasks' => $this->formatTasksForOfferSelect($offerBody->getOffer(), $offerBody->getId()),
  119.             'selectedTaskId' => $linkedTask $linkedTask->getId() : 0,
  120.             'linkedTaskWorkedTime' => $linkedTaskWorkedTime,
  121.         ));
  122.     }
  123.     /**
  124.      * @Route("/admin/app/offer/offer_delete_row", name="offer_delete_row", methods={"POST"} )
  125.      */
  126.     public function offerDeleteRowAction(Request $request): Response
  127.     {
  128.         $bodyId = (int)$request->get('bodyId');
  129.         $offerId = (int)$request->get('offerId');
  130.         $offer $this->offerRepository->find($offerId);
  131.         $offerRow $this->offerBodyRepository->find($bodyId);
  132.         $this->entityManager->remove($offerRow);
  133.         $this->entityManager->flush();
  134.         //$this->pdfGenerator->generateOffer($offerRow->getOffer());
  135.         $data[] = $this->datatableProvider->datatableRow($offer);
  136.         return new JsonResponse(array('msg' => true'datatableRow' => $data[0]), 200);
  137.     }
  138.     /**
  139.      * @Route("/admin/app/offer/offer_save_new_row", name="offer_save_new_row", methods={"POST"} )
  140.      */
  141.     public function offerSaveNewRowAction(Request $request): Response
  142.     {
  143.         $offerId = (int)$request->get('offerId');
  144.         $total = (float)$request->get('body_value');
  145.         $estimatedHour = (int)$request->get('hour');
  146.         $this->offerBodyPersister->saveUpdateOfferBody($request);
  147.         $offer $this->offerRepository->find($offerId);
  148.         //$this->pdfGenerator->generateOffer($offer);
  149.         $data[] = $this->datatableProvider->datatableRow($offer);
  150.         $data[0]['total']=number_format(($data[0]['total']+$total),2,'.','');
  151.         $data[0]['estimatedHour'] = $data[0]['estimatedHour']+$estimatedHour;
  152.         return new JsonResponse(array('msg' => true'datatableRow' => $data[0]), 200);
  153.     }
  154.     /**
  155.      * @Route("/admin/app/offer/offer_accepted_row", name="offer_accepted_row", methods={"POST"} )
  156.      */
  157.     public function offerAcceptedRowAction(Request $request): Response
  158.     {
  159.         $bodyId = (int)$request->get('bodyId');
  160.         $offerRow $this->offerBodyRepository->find($bodyId);
  161.         $accepted = ($offerRow->isAccepted()) ? false true;
  162.         $ok=$this->offerManager->createTaskFromOfferBody($offerRow$accepted);
  163.         $this->entityManager->flush();
  164.         return new JsonResponse(array('msg' => $ok'accepted' => $accepted), 200);
  165.     }
  166.     /**
  167.      * @Route("/admin/app/offer/offer_task_data", name="offer_task_data", methods={"POST"} )
  168.      */
  169.     public function offerTaskDataAction(Request $request): Response
  170.     {
  171.         $taskId = (int)$request->get('taskId');
  172.         $offerId = (int)$request->get('offerId');
  173.         $task $this->taskRepository->find($taskId);
  174.         $offer $this->offerRepository->find($offerId);
  175.         if (!$task || !$offer || $task->getProject()->getId() !== $offer->getProject()->getId()) {
  176.             return new JsonResponse(['msg' => false], 400);
  177.         }
  178.         $workedMinutes = (int)($task->getWorkedMinutes() ?? 0);
  179.         $hourlyRate = (float)$offer->getHourlyRate();
  180.         $value round(($hourlyRate 60) * $workedMinutes2);
  181.         $hours $workedMinutes ? (int)max(1ceil($workedMinutes 60)) : 0;
  182.         return new JsonResponse([
  183.             'msg' => true,
  184.             'description' => $task->getName(),
  185.             'technical_description' => $task->getTechnicalDescription() ?? '',
  186.             'hour' => $hours,
  187.             'value' => $value,
  188.             'worked_minutes' => $workedMinutes,
  189.             'worked_time' => $this->formatWorkedMinutes($workedMinutes),
  190.         ], 200);
  191.     }
  192.     /**
  193.      * @Route("/admin/app/offer/offer_add", name="offer_add", methods={"POST"} )
  194.      */
  195.     public function offerAddAction(Request $request): Response
  196.     {
  197.         $projectStatus = [ProjectStatus::PROJECT_STATUS_BEFEJEZETTProjectStatus::PROJECT_STATUS_VISSZAUTASITOTT];
  198.         $project $this->entityManager->getRepository(Project::class)->getProjectByStatusNotIn($projectStatus);
  199.         $offerStatus $this->offerStatusRepository->findAll();
  200.         $currency $this->currencyRepository->findAll();
  201.         $language $this->languageRepository->findAll();
  202.         return $this->renderWithExtraParams('/offer/offer_add.html.twig', array(
  203.             'project' => $project,
  204.             'title' => $this->translator->trans('New offer'),
  205.             'edited' => false,
  206.             'offerStatus' => $offerStatus,
  207.             'currency' => $currency,
  208.             'language' => $language
  209.         ));
  210.     }
  211.     /**
  212.      * @Route("/admin/app/offer/offer_edit", name="offer_edit", methods={"POST"} )
  213.      */
  214.     public function offerEditAction(Request $request): Response
  215.     {
  216.         $projectStatus = [ProjectStatus::PROJECT_STATUS_BEFEJEZETTProjectStatus::PROJECT_STATUS_VISSZAUTASITOTT];
  217.         $project $this->entityManager->getRepository(Project::class)->getProjectByStatusNotIn($projectStatus);
  218.         $offerStatus $this->offerStatusRepository->findAll();
  219.         $currency $this->currencyRepository->findAll();
  220.         $offer $this->offerRepository->find($request->get('id'));
  221.         $language $this->languageRepository->findAll();
  222.         return $this->renderWithExtraParams('/offer/offer_add.html.twig', array(
  223.             'project' => $project,
  224.             'title' => $this->translator->trans('Edit offer'),
  225.             'edited' => false,
  226.             'offerStatus' => $offerStatus,
  227.             'currency' => $currency,
  228.             'offer'=> $offer,
  229.             'language' => $language
  230.         ));
  231.     }
  232.     /**
  233.      * @Route("/admin/app/offer/offer_accept_all", name="offer_accept_all", methods={"POST"} )
  234.      */
  235.     public function offerAcceptAllAction(Request $request): Response
  236.     {
  237.         $offer $this->offerRepository->find($request->get('id'));
  238.         $accepted = (int)$request->get('accepted') !== 0;
  239.         $this->offerManager->createTasksFromOffer($offer$accepted);
  240. //        try {
  241. //            $sqlData=[ 'offer_id'=>$offer->getId(), 'accepted'=>(int)$request->get('accepted')];
  242. //            $this->entityManager->getConnection()->prepare('Update offer_body SET accepted = :accepted where offer_id=:offer_id')->executeQuery($sqlData);
  243. //            $this->offerManager->createTasksFromOffer($offer);
  244. //        } catch (Exception $e) {
  245. //
  246. //        }
  247.         return new JsonResponse(array('msg' => true,  200));
  248.     }
  249.     /**
  250.      * @Route("/admin/app/offer/offer_project_change", name="offer_project_change", methods={"POST"} )
  251.      */
  252.     public function offerProjectChangeAction(Request $request): Response
  253.     {
  254.         $id $request->get('projectId');
  255.         $project $this->projectRepository->find($id);
  256.         return new JsonResponse(array('msg' => true'hourRate' => $project->getHourlyRate(), 'currency' => $project->getCurrency()->getId()), 200);
  257.     }
  258.     /**
  259.      * @Route("/admin/app/offer/offer_save", name="offer_save", methods={"POST"} )
  260.      */
  261.     public function offerSaveAction(Request $request): Response
  262.     {
  263.         $offer $this->offerPersister->saveOffer($request);
  264.         //$this->pdfGenerator->generateOffer($offer);
  265.         $data[] = $this->datatableProvider->datatableRow($offer);
  266.         return new JsonResponse(array('msg' => true'datatableRow' => $data[0]), 200);
  267.     }
  268.     /**
  269.      * @Route("/admin/app/offer/offer_pdf_print", name="offer_pdf_print", methods={"POST"} )
  270.      */
  271.     public function offerPdfPrintAction(Request $request): Response
  272.     {
  273.         $id = (int)$request->request->get("id");
  274.         $offer $this->offerRepository->find($id);
  275.         $this->pdfGenerator->generateOffer($offer);
  276.         $protocol stripos($_SERVER['SERVER_PROTOCOL'], 'https') === 'https://' 'http://';
  277.         $domainName $_SERVER['HTTP_HOST'].'/';
  278.         $filename 'Oferta de pret - '.$offer->getProject()->getName().' - '.$offer->getProject()->getCompany()->getName().' - '.$offer->getOfferDate()->format('d-m-Y').' - '.$offer->getId().'.pdf';
  279.         $offer '/offer/'.$filename;
  280.         return new JsonResponse(array('filePath'=> $protocol.$domainName.$offer'filename'=>$filename), 200);
  281.     }
  282.     /**
  283.      * @Route("/admin/app/offer/offer_delete", name="offer_delete", methods={"POST"} )
  284.      */
  285.     public function offerDeleteAction(Request $request): Response
  286.     {
  287.         $id = (int)$request->get('id');
  288.         $offer $this->offerRepository->find($id);
  289.         $this->entityManager->remove($offer);
  290.         $this->entityManager->flush();
  291.         return new JsonResponse(array('msg' => true),  200);
  292.     }
  293.     /**
  294.      * @Route("/admin/app/offer/offer_duplication", name="offer_duplication", methods={"POST"} )
  295.      */
  296.     public function offerDuplicationAction(Request $request): Response
  297.     {
  298.         $id = (int)$request->get('id');
  299.         $offer=$this->offerManager->offerDuplication($id);
  300.         $data[] = $this->datatableProvider->datatableRow($offer);
  301.         $data[0]['total']=$offer->oldTotal;
  302.         $data[0]['estimatedHour']=$offer->oldEstimatedHour;
  303.         return new JsonResponse(array('msg' => true'datatableRow' => $data[0]), 200);
  304.     }
  305.     private function formatTasksForOfferSelect($offer, ?int $currentOfferBodyId null): array
  306.     {
  307.         $items = [];
  308.         foreach ($this->taskRepository->getTasksAvailableForOffer($offer->getProject()->getId(), $currentOfferBodyId) as $task) {
  309.             $workedMinutes = (int)($task->getWorkedMinutes() ?? 0);
  310.             $items[] = [
  311.                 'id' => $task->getId(),
  312.                 'orderTask' => $task->getOrderTask(),
  313.                 'name' => $task->getOrderTask() . '. ' strip_tags($task->getName()) . ' - ' $this->formatWorkedMinutes($workedMinutes),
  314.             ];
  315.         }
  316.         return $items;
  317.     }
  318.     private function formatWorkedMinutes(int $minutes): string
  319.     {
  320.         return sprintf('%d:%02d'intdiv($minutes60), $minutes 60);
  321.     }
  322. }