src/Controller/IndexController.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Hours;
  4. use App\Entity\User;
  5. use App\Form\HoursInputType;
  6. use App\Repository\ContractRepository;
  7. use App\Repository\HoursRepository;
  8. use App\Service\AirtableHelper;
  9. use App\Service\Stats\Loader;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  16. use DateTime;
  17. class IndexController extends AbstractController
  18. {
  19.     #[Route('/'name'dashboard')]
  20.     #[IsGranted(User::ROLE_USER)]
  21.     public function index(
  22.         Request $request,
  23.         HoursRepository $hoursRepository,
  24.         AirtableHelper $airtableHelper,
  25.         Loader $loader
  26.     ): Response
  27.     {
  28.         $userId $this->getUser()->getId();
  29.         $result $loader->load($this->getUser());
  30.         $hours = (new Hours())
  31.             ->setDate(new \DateTimeImmutable());
  32.         $form  $this->createForm(HoursInputType::class, $hours, [
  33.             'projects' => $result->getProjects(),
  34.             'userId'   => $userId
  35.         ]);
  36.         $form->handleRequest($request);
  37.         if ($form->isSubmitted() && $form->isValid()) {
  38.             $hour $hoursRepository->findOneBy(['contract' => $hours->getContract(), 'date' => $hours->getDate()]);
  39.             if ($hour) {
  40.                 $hour
  41.                     ->setHours($hours->getHours())
  42.                     ->setNote($hours->getNote())
  43.                     ->setStatus($hours->getStatus())
  44.                 ;
  45.                 $data $hour;
  46.             } else {
  47.                 $data $hours;
  48.             }
  49.             $airtableHelper->sync($data);
  50.             $projectName $hours->getContract()->getProject()->getCompany()->getName() . ' ' $hours->getContract()->getProject()->getName();
  51.             $message     sprintf("%d hours has been set for \"%s\" project @%s"$hours->getHours(), $projectName$hours->getDate()->format("Y-m-d"));
  52.             $this->addFlash('success'$message);
  53.             return $this->redirectToRoute('dashboard');
  54.         }
  55.         $data = [
  56.             'form'            => $form->createView(),
  57.             'month'           => date('M'),
  58.             'year'            => date('Y'),
  59.             'dataGrid'        => $result,
  60.         ];
  61.         return $this->render('index.html.twig'$data);
  62.     }
  63.     /**
  64.      * @Route("/write-week/{date}", name="writeWeek")
  65.      * @IsGranted("ROLE_USER")
  66.      */
  67.     public function writeWeek(
  68.         string $date,
  69.         EntityManagerInterface $entityManager,
  70.         ContractRepository $contractRepository,
  71.         HoursRepository $hoursRepository,
  72.         AirtableHelper $airtableHelper
  73.     ): Response
  74.     {
  75.         $dObj   = new DateTime($date);
  76.         $userId $this->getUser()->getId();
  77.         $contracts $hoursRepository->getContractHours($userId$dObj);
  78.         foreach ($contracts as $cData) {
  79.             if ($cData['hour_id']) {
  80.                 $hour $hoursRepository->find($cData['hour_id']);
  81.             } else {
  82.                 $contract $contractRepository->find($cData['contract_id']);
  83.                 $hour = (new Hours())
  84.                     ->setContract($contract)
  85.                     ->setHours(0)
  86.                     ->setDate($dObj);
  87.             }
  88.             $hour->setStatus(Hours::STATUS_CLOSED);
  89.             $airtableHelper->sync($hour);
  90.         }
  91.         $this->addFlash('success'$dObj->format('Y-m-d'));
  92.         return $this->redirectToRoute('dashboard');
  93.     }
  94. }