<?php
namespace App\Controller;
use App\Entity\MaxTimeProject;
use App\Entity\ProjectOfferPackage;
use App\Entity\Task;
use App\Form\ChooseMonthInProjectType;
use App\Form\DashboardDateType;
use App\Repository\ProjectOfferPackageRepository;
use App\Repository\ProjectRepository;
use App\Repository\SettingsRepository;
use App\Repository\TaskRepository;
use App\Service\OfferPackage\OfferPackageService;
use App\Service\TaskService;
use App\Service\TimeService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class DashboardController extends AbstractController
{
/**
* @var ProjectRepository
*/
private ProjectRepository $projectRepository;
/**
* @var TaskRepository
*/
private TaskRepository $taskRepository;
public function __construct(ProjectRepository $projectRepository, TaskRepository $taskRepository)
{
$this->projectRepository = $projectRepository;
$this->taskRepository = $taskRepository;
}
/**
* @Route("/", name="dashboard")
*/
public function index(Request $request, TaskService $taskService, OfferPackageService $offerPackageService, SettingsRepository $settingsRepository): Response
{
if($this->isGranted("ROLE_CALCULATOR")) {
return $this->redirectToRoute("calculator-ads");
}
$plannedTaskDay = $request->get("plannedTaskDay") ? new \DateTimeImmutable($request->get("plannedTaskDay")) : new \DateTimeImmutable();
$nextDayPlannedTaskDay = $plannedTaskDay->add(new \DateInterval("P1D"));
$previousDayPlannedTaskDay = $plannedTaskDay->sub(new \DateInterval("P1D"));
$weeklyRaport = false;
if ($settingsRepository->findOneBy(["name" => "weekly", "value" => (new \DateTime())->format('Y-m-d 00:00:00')])) {
$weeklyRaport = true;
}
$newLimit = $this->checkLimitInProjects();
if ($data = $request->request->get("projects")) {
foreach ($data as $id => $timeLimit) {
$maxTime = new MaxTimeProject();
$maxTime->setHourLimit($timeLimit);
$maxTime->setProject($this->projectRepository->find($id));
$project = $this->projectRepository->findOneBy(["id" => $id]);
$project->setDescription($request->request->get("projectDescription")[$id]);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($maxTime);
$entityManager->persist($project);
$entityManager->flush();
}
return $this->render('dashboard/index.html.twig', [
"newLimit" => $newLimit,
'weekly_raport' => $weeklyRaport,
'tasks' => $this->taskRepository->findTasks([
"project" => null,
"plannedOnDayStart" => $plannedTaskDay->modify("00:00"),
"plannedOnDayEnd" => $plannedTaskDay->modify("23:59"),
"user" => $this->getUser(),
]),
"currentDate" => $plannedTaskDay,
"previousDate" => $previousDayPlannedTaskDay->format("Y-m-d"),
"nextDate" => $nextDayPlannedTaskDay->format("Y-m-d"),
]);
}
if($this->isGranted("ROLE_CLIENT") && !$this->isGranted("ROLE_ADMIN") && !$this->isGranted("ROLE_EMPLOYER")) {
$projects = $this->getUser()->getClientProjects();
$month = new \DateTime();
$ppp = [];
$percentage = [];
// $allegroAccounts = [];
foreach($projects as $key => $project) {
/** @var ProjectOfferPackage $projectOfferPackage */
$percentage[] = $offerPackageService->completedPercentageOfferTask($project, $month);
// $allegroAccounts[] = explode(",", $project->getAllegroAccount());
}
return $this->render('dashboard/index.html.twig', [
"projects" => $projects,
'month' => $month,
'percentage' => $percentage,
'offerPackages' => $ppp,
'tasks' => $this->taskRepository->findTasks([
"project" => $projects,
"plannedOnDayStart" => $plannedTaskDay->modify("00:00"),
"plannedOnDayEnd" => $plannedTaskDay->modify("23:59"),
]),
"currentDate" => $plannedTaskDay,
"previousDate" => $previousDayPlannedTaskDay->format("Y-m-d"),
"nextDate" => $nextDayPlannedTaskDay->format("Y-m-d"),
// 'allegroAccounts' => $allegroAccounts,
]);
}
$userTasks = $this->taskRepository->findTasks([
// "plannedOnDayEnd" => $plannedTaskDay->modify("23:59"),
// "plannedOnDayStart" => $plannedTaskDay->modify("00:00"),
"user" => $this->getUser(),
]);
$parsed = [];
foreach ($userTasks as $task) {
$parsed = array_merge($parsed, $taskService->getRepeatableTaskData($task, $plannedTaskDay->modify("00:00"), $plannedTaskDay->modify("23:59")));
}
return $this->render('dashboard/index.html.twig', [
"newLimit" => $newLimit,
'weekly_raport' => $weeklyRaport,
'tasks' => $parsed,
'allTasks' => $this->taskRepository->findTasks([
"plannedOnDayStart" => $plannedTaskDay->modify("00:00"),
"plannedOnDayEnd" => $plannedTaskDay->modify("23:59"),
"limit" => 10,
"hard" => true,
"status" => Task::STATUS_PLANNED,
]),
"projects" => $this->projectRepository->getProjectListByUser($this->getUser()),
"currentDate" => $plannedTaskDay,
"previousDate" => $previousDayPlannedTaskDay->format("Y-m-d"),
"nextDate" => $nextDayPlannedTaskDay->format("Y-m-d"),
]);
}
/**
* @return array
*/
private function checkLimitInProjects(): array
{
$newLimit = [];
$i = 0;
$limitProject = $this->projectRepository->limitsInThisMonth();
$allIds = array_map(function ($d) {
return $d->getId();
},$this->projectRepository->findAll());
$limitIds = array_map(function ($d) {
return $d->getId();
}, $limitProject);
$noLimitProject = array_diff($allIds, $limitIds);
foreach ($noLimitProject as $project) {
$newLimit[$i]['project'] = $this->projectRepository->findOneBy(["id" => $project]);
$newLimit[$i]['lastLimit'] = $this->projectRepository->getLastLimit($this->projectRepository->findOneBy(["id" => $project]));
$i++;
}
return $newLimit;
}
}