<?php
namespace App\Controller\Web;
use App\Entity\Building;
use App\Entity\Obligation;
use App\Entity\User;
use App\Form\ObligationBuildingType;
use App\Form\ObligationType;
use App\Repository\BuildingRepository;
use App\Repository\ObligationRepository;
use App\Repository\UserRepository;
use App\Services\EquipmentService;
use App\Services\ObligationService;
use App\Services\ReportService;
use App\Services\TaskService;
use DateTime;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ObligationController extends AbstractController
{
private BuildingRepository $buildingRepository;
private ObligationService $obligationService;
private TaskService $taskService;
private UserRepository $userRepository;
private EquipmentService $equipmentService;
private ReportService $reportService;
private ObligationRepository $obligationRepository;
/**
* @param BuildingRepository $buildingRepository
* @param ObligationService $obligationService
* @param TaskService $taskService
* @param EquipmentService $equipmentService
* @param ReportService $reportService
* @param UserRepository $userRepository
* @param ObligationRepository $obligationRepository
*/
public function __construct(
BuildingRepository $buildingRepository,
ObligationService $obligationService,
TaskService $taskService,
EquipmentService $equipmentService,
ReportService $reportService,
UserRepository $userRepository,
ObligationRepository $obligationRepository
) {
$this->buildingRepository = $buildingRepository;
$this->obligationService = $obligationService;
$this->taskService = $taskService;
$this->userRepository = $userRepository;
$this->equipmentService = $equipmentService;
$this->reportService = $reportService;
$this->obligationRepository = $obligationRepository;
}
/**
* @return Response
* @throws Exception
*/
#[Route('/obligations', name: 'obligation')]
public function obligationsList(): Response
{
/** @var User $user */
$user = $this->getUser();
$companyUsers = $this->userRepository->findUsersByMain($user);
$obligations = $this->obligationService->getAllObligationsForCalendarByUser($companyUsers);
$buildings = $this->buildingRepository->getAllBuildingsByCompanyUsers($companyUsers);
$tasks = $this->taskService->getAllTasksForCalendar($companyUsers);
$equipments = $this->equipmentService->getAllEquipmentsForCalendar($companyUsers);
$reports = $this->reportService->getAllReportsForCalendar($companyUsers);
$calendarData = array_merge($tasks, $obligations, $equipments, $reports);
$form = $this->createForm(
ObligationBuildingType::class,
null,
[
'method' => 'POST',
'action' => $this->generateUrl('obligation_add_new'),
'attr' => ['id' => 'obligation_building_form'],
'buildings' => $buildings,
]
);
return $this->render('@views/Obligation/obligationsList.html.twig', [
'calendarData' => $calendarData,
'form' => $form->createView()
]);
}
/**
* @Route("/obligations/create", name="obligation_add_new", options={"expose"=true}, methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function addNewObligationAction(Request $request): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
$companyUsers = $this->userRepository->findUsersByMain($user);
$buildings = $this->buildingRepository->getAllBuildingsByCompanyUsers($companyUsers);
$form = $this->createForm(ObligationBuildingType::class, null, [
'buildings' => $buildings,
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
/** @var Building $obligationBuilding */
$obligationBuilding = $data['building'];
$obligation = $this->obligationService->createObligationFromCalendar($obligationBuilding->getUser(), $data);
return new JsonResponse([
'obligation' => $obligation,
]);
}
return new JsonResponse([
'message' => 'Greška.',
], 400);
}
/**
* @Route("/today-obligations", name="obligation_today", options={"expose"=true})
* @return JsonResponse
* @throws Exception
*/
public function todayObligations(): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
$companyUsers = $this->userRepository->findUsersByMain($user);
$today = new DateTime();
$obligations = $this->obligationService->getAllObligationsForToday($companyUsers, $today->format('Y-m-d'));
return new JsonResponse([
'success' => true,
'calendarData' => $obligations
]);
}
/**
* @Route("/obligations-number", name="obligation_number", options={"expose"=true})
* @return JsonResponse
* @throws Exception
*/
public function getObligationsNumber(): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
$companyUsers = $this->userRepository->findUsersByMain($user);
$today = new DateTime();
$obligation = $this->obligationService->getAllObligationsForToday($companyUsers, $today->format('Y-m-d'));
return new JsonResponse([
'success' => true,
'dataSum' => count($obligation),
]);
}
/**
* @Route(
* "/do_obligation/{id}/{type}",
* requirements={"id" = "\d+", "type" = "\d+"},
* name="obligation_action",
* options={"expose"=true}
* )
*
* @param Request $request
* @param int $id
* @param int $type
*
* @return JsonResponse
*/
public function doObligationAction(Request $request, int $id, int $type): JsonResponse
{
/** @var Obligation $obligation */
$obligation = $this->obligationRepository->find($id);
if ($type == 1) {
$obligation->setDone(true);
} else {
$obligation->setDone(false);
}
$this->obligationRepository->save($obligation);
return new JsonResponse(['success' => true]);
}
/**
* Deletes a obligation entity.
*
* @Route(
* "/obligation/{id}",
* requirements={"id" = "\d+"},
* name="obligation_delete",
* options={"expose"=true},
* methods={"DELETE", "GET"}
* )
*
* @param Request $request
* @param int $id
*
* @return JsonResponse
*/
public function deleteObligationAction(Request $request, int $id): JsonResponse
{
$id = $request->get('id');
/** @var Obligation $obligation */
$obligation = $this->obligationRepository->find($id);
$form = $this->createForm(ObligationType::class, $obligation, [
'action' => $this->generateUrl('obligation_delete', ['id' => $obligation->getId()]),
'attr' => ['id' => 'deleteObligationEntry'],
'method' => 'DELETE',
]);
$form->add(
'delete',
SubmitType::class,
[
'label' => 'Obrisati',
'attr' => ['class' => 'btn']
]
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->obligationRepository->remove($obligation);
return new JsonResponse(["success" => "true"]);
}
return new JsonResponse([
'html' => $this->renderView(
"@views/Obligation/obligationDelete.html.twig",
['form' => $form->createView()]
),
'success' => true
]);
}
}