<?php
namespace App\Controller;
use App\Entity\LoggedTime;
use App\Entity\OfferPackageTask;
use App\Entity\ProjectOfferPackage;
use App\Entity\Task;
use App\Module\Slack\SlackManager;
use App\Repository\OfferPackageTaskRepository;
use App\Repository\ProjectOfferPackageRepository;
use App\Repository\ProjectRepository;
use App\Repository\TaskRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* Class ProjectOfferPackageTaskController
*
* @package App\Controller
* @author Lukasz Krakowiak <lukasz94krakowiak@gmail.com>
* @Route("projekt-oferta-zadanie")
*/
class ProjectOfferPackageTaskController extends AbstractController
{
/**
* @Route("/zakoncz", name="project_offer_package_task_complete")
*/
public function index(
Request $request,
ProjectRepository $projectRepository,
OfferPackageTaskRepository $offerPackageTaskRepository,
ProjectOfferPackageRepository $projectOfferPackageRepository,
TaskRepository $taskRepository,
SlackManager $slackManager
): Response {
if ($request->get('type') && $request->get('type') == "1") {//zakonczenie normalnego zadania bezposrednio
/** @var Task $task */
$task = $taskRepository->findOneBy(["id" => $request->get('task')]);
$task->setCompletedAt(new \DateTimeImmutable())
->setStatus(Task::STATUS_COMPLETED);
$taskRepository->save($task);
$time = new LoggedTime($this->getUser());
$time->setWorkTime(0)
->setProject($task->getProject())
->setDescription($task->getName() ?? "wykonanie zadania");
$taskRepository->save($time);
return $this->redirect($request->headers->get('referer'));
}
$task = $offerPackageTaskRepository->findOneBy(["id" => $request->get('task')]);
$project = $projectRepository->findOneBy(["id" => $request->get('project')]);
/** @var ProjectOfferPackage $projectOfferPackage */
$projectOfferPackage = $projectOfferPackageRepository->getProjectOfferPackageInSetMonth($project, new \DateTime($request->get('month')));
$data = $this->getProjectOfferPackageData($projectOfferPackage, $task->getId());
if (isset($data[$task->getId()]['status']) && $data[$task->getId()]['status'] === OfferPackageTask::STATUS_COMPLETED) {
$this->redirect($request->headers->get('referer'));
}
if ($task->isRepeatable()) {
$partialNumber = isset($data[$task->getId()]['partial']) ? $data[$task->getId()]['partial'] + 1 : 1;
if (isset($data[$task->getId()]['partial']) && $task->getRepeatInMonth() == $partialNumber) {
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_COMPLETED;
} else {
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_PARTIAL_COMPLETED;
}
$data[$task->getId()]['partial'] = $partialNumber;
} else {
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_COMPLETED;
}
if ($request->get('task-normal')) {
$taskNormal = $taskRepository->findOneBy(["id" => $request->get('task-normal')]);
$taskNormal->setStatus(Task::STATUS_COMPLETED)
->setCompletedAt(new \DateTimeImmutable());
$taskRepository->save($taskNormal);
} else {
/** @var Task $taskNormal */
$taskNormal = $taskRepository->findNormalTaskFromOfferPackageTask($project, $task, new \DateTime());
if ($taskNormal) {
$taskNormal->setStatus(Task::STATUS_COMPLETED)
->setCompletedAt(new \DateTimeImmutable());
$taskRepository->save($taskNormal);
} else {
if ($this->getUser()->getId() == 43) {
$slackManager->write(
"<@".($this->getUser()->getSlackChannelId() ?? $this->getUser()->getName())."> wykonał zadanie ".$task->getName().PHP_EOL
."<@".($project->getLeader()->getSlackChannelId() ?? $project->getLeader()->getName())."> - Dla twojej informacji",
'C02UN73M6BT'
);
}
}
}
if ($request->get('time')) {
$time = $this->stringTimeToNumber(trim($request->get('time'))) * 60;
$data[$task->getId()]["time"] = isset($data[$task->getId()]["time"]) ? $data[$task->getId()]["time"] + $time : $time;
} else {
$data[$task->getId()]["time"] = isset($data[$task->getId()]["time"]) ? $data[$task->getId()]["time"] : 0;
}
$data[$task->getId()]["who"] = $this->getUser()->getName();
$data[$task->getId()]["when"] = (new \DateTime())->format('Y-m-d H:i:s');
$projectOfferPackage->setData($data);
$projectOfferPackageRepository->save($projectOfferPackage);
return $this->redirect($request->headers->get('referer'));
}
/**
* @Route("/zakoncz-js", name="project_offer_package_task_complete_js")
*/
public function indexJS(
Request $request,
ProjectRepository $projectRepository,
OfferPackageTaskRepository $offerPackageTaskRepository,
ProjectOfferPackageRepository $projectOfferPackageRepository,
TaskRepository $taskRepository,
SlackManager $slackManager
): Response {
// return $this->json([]);
if ($request->get('type') && $request->get('type') == "1") {//zakonczenie normalnego zadania bezposrednio
/** @var Task $task */
$task = $taskRepository->findOneBy(["id" => $request->get('task')]);
$task->setCompletedAt(new \DateTimeImmutable())
->setStatus(Task::STATUS_COMPLETED)
->setGraphicUrl($request->get('url') ?? null);
$taskRepository->save($task);
$time = new LoggedTime($this->getUser());
$time->setWorkTime(0)
->setProject($task->getProject())
->setDescription($task->getName() ?? "wykonanie zadania");
$taskRepository->save($time);
if($request->get('url')){
$slackManager->write(
$this->getUser()->getName()." wykonał zadanie. URL od grafik: ".$request->get('url').PHP_EOL.
"<@".($task->getCreatedBy()->getSlackChannelId())."> - Dla twojej informacji",
'C02UN73M6BT'
);
}
return $this->json([]);
}
$task = $offerPackageTaskRepository->findOneBy(["id" => $request->get('task')]);
$project = $projectRepository->findOneBy(["id" => $request->get('project')]);
/** @var ProjectOfferPackage $projectOfferPackage */
$projectOfferPackage = $projectOfferPackageRepository->getProjectOfferPackageInSetMonth($project, new \DateTime($request->get('month')));
$data = $this->getProjectOfferPackageData($projectOfferPackage, $task->getId());
if (isset($data[$task->getId()]['status']) && $data[$task->getId()]['status'] === OfferPackageTask::STATUS_COMPLETED) {
// return $this->json([]);
}
if ($task->isRepeatable()) {
$partialNumber = isset($data[$task->getId()]['partial']) ? $data[$task->getId()]['partial'] + 1 : 1;
if (isset($data[$task->getId()]['partial']) && $task->getRepeatInMonth() == $partialNumber) {
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_COMPLETED;
} else {
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_PARTIAL_COMPLETED;
}
$data[$task->getId()]['partial'] = $partialNumber;
} else {
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_COMPLETED;
}
if ($request->get('task_normal')) {
$taskNormal = $taskRepository->findOneBy(["id" => $request->get('task_normal')]);
$taskNormal->setStatus(Task::STATUS_COMPLETED)
->setCompletedAt(new \DateTimeImmutable())
->setGraphicUrl($request->get('url') ?? null);
$taskRepository->save($taskNormal);
} else {
/** @var Task $taskNormal */
$taskNormal = $taskRepository->findNormalTaskFromOfferPackageTask($project, $task, new \DateTime());
if ($taskNormal) {
$taskNormal->setStatus(Task::STATUS_COMPLETED)
->setCompletedAt(new \DateTimeImmutable())
->setGraphicUrl($request->get('url') ?? null);
$taskRepository->save($taskNormal);
} else {
$slackManager->write(
"<@".($this->getUser()->getSlackChannelId() ?? $this->getUser()->getName())."> wykonał zadanie ".$task->getName().PHP_EOL
."<@".($project->getLeader()->getSlackChannelId() ?? $project->getLeader()->getName())."> - Dla twojej informacji",
$project->getSlackChannelId()
);
}
}
if ($request->get('time')) {
$time = $this->stringTimeToNumber(trim($request->get('time'))) * 60;
$data[$task->getId()]["time"] = isset($data[$task->getId()]["time"]) ? $data[$task->getId()]["time"] + $time : $time;
$timeObject = new LoggedTime($this->getUser());
$timeObject->setWorkTime($time)
->setProject($projectOfferPackage->getProject())
->setDescription($task->getName() ?? "wykonanie zadania");
$taskRepository->save($timeObject);
} else {
$data[$task->getId()]["time"] = isset($data[$task->getId()]["time"]) ? $data[$task->getId()]["time"] : 0;
}
$data[$task->getId()]["who"] = $this->getUser()->getName();
$data[$task->getId()]["when"] = (new \DateTime())->format('Y-m-d H:i:s');
$projectOfferPackage->setData($data);
$projectOfferPackageRepository->save($projectOfferPackage);
return $this->json([]);
}
/**
* @Route("/nie-robimy", name="project_offer_package_task_not_to_do")
*/
public function notDo(Request $request, ProjectRepository $projectRepository, OfferPackageTaskRepository $offerPackageTaskRepository, ProjectOfferPackageRepository $projectOfferPackageRepository): Response
{
$task = $offerPackageTaskRepository->findOneBy(["id" => $request->get('task')]);
$project = $projectRepository->findOneBy(["id" => $request->get('project')]);
/** @var ProjectOfferPackage $projectOfferPackage */
$projectOfferPackage = $projectOfferPackageRepository->getProjectOfferPackageInCurrentMonth($project);
$data = $this->getProjectOfferPackageData($projectOfferPackage, $task->getId());
if (isset($data[$task->getId()]['status']) && $data[$task->getId()]['status'] === OfferPackageTask::STATUS_COMPLETED) {
return $this->redirectToRoute('project_show', ["project" => $project->getId()]);
}
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_NOT;
$data[$task->getId()]["reason"] = $request->get('reason');
$projectOfferPackage->setData($data);
$projectOfferPackageRepository->save($projectOfferPackage);
return $this->redirectToRoute('project_show', ["project" => $project->getId()]);
}
/**
* @Route("/nie-robimy-js", name="project_offer_package_task_not_to_do_dashboard")
*/
public function notDoDashboard(Request $request, TaskRepository $taskRepository, ProjectRepository $projectRepository, OfferPackageTaskRepository $offerPackageTaskRepository, ProjectOfferPackageRepository $projectOfferPackageRepository): Response
{
$type = $request->get('type');
if ($type == 0) {
$task = $offerPackageTaskRepository->findOneBy(["id" => $request->get('task')]);
$taskObject = $taskRepository->findOneBy(["id" => $request->get('task_normal')]);
$project = $projectRepository->findOneBy(["id" => $request->get('project')]);
/** @var ProjectOfferPackage $projectOfferPackage */
$projectOfferPackage = $projectOfferPackageRepository->getProjectOfferPackageInCurrentMonth($project);
$data = $this->getProjectOfferPackageData($projectOfferPackage, $task->getId());
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_NOT;
$data[$task->getId()]["reason"] = $request->get('reason');
$projectOfferPackage->setData($data);
$projectOfferPackageRepository->save($projectOfferPackage);
} else {
$taskObject = $taskRepository->findOneBy(["id" => $request->get('task')]);
}
$taskObject->setStatus(Task::STATUS_NOT_TO_DO)->setInfo($request->get('reason'));
$taskRepository->save($taskObject);
return $this->json([]);
}
/**
* @Route("/zmiana-daty", name="project_offer_package_task_change_date")
*/
public function changeDate(Request $request, TaskRepository $taskRepository, ProjectRepository $projectRepository, OfferPackageTaskRepository $offerPackageTaskRepository, ProjectOfferPackageRepository $projectOfferPackageRepository): Response
{
$type = $request->get('type');
if ($type == 0) {
$task = $offerPackageTaskRepository->findOneBy(["id" => $request->get('task')]);
$taskObject = $taskRepository->findOneBy(["id" => $request->get('task_normal')]);
$project = $projectRepository->findOneBy(["id" => $request->get('project')]);
/** @var ProjectOfferPackage $projectOfferPackage */
$projectOfferPackage = $projectOfferPackageRepository->getProjectOfferPackageInCurrentMonth($project);
$data = $this->getProjectOfferPackageData($projectOfferPackage, $task->getId());
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_PLANNED;
$data[$task->getId()]["reason"] = $request->get('reason')." - Nowa data: ".$request->get('date');
$projectOfferPackage->setData($data);
$projectOfferPackageRepository->save($projectOfferPackage);
} else {
$taskObject = $taskRepository->findOneBy(["id" => $request->get('task')]);
}
$taskObject->setStatus(Task::STATUS_REPLANNED)->setPlannedOnDay(new \DateTimeImmutable($request->get('date')))
->setInfo($request->get('reason'));
$taskRepository->save($taskObject);
return $this->json([]);
}
/**
* @Route("/zapauzuj-zadanie", name="project_offer_package_task_pause")
*/
public function pauseTask(Request $request, TaskRepository $taskRepository, ProjectRepository $projectRepository, OfferPackageTaskRepository $offerPackageTaskRepository, ProjectOfferPackageRepository $projectOfferPackageRepository): Response
{
$type = $request->get('type');
if ($type == 0) {
$task = $offerPackageTaskRepository->findOneBy(["id" => $request->get('task')]);
$taskObject = $taskRepository->findOneBy(["id" => $request->get('task_normal')]);
$project = $projectRepository->findOneBy(["id" => $request->get('project')]);
/** @var ProjectOfferPackage $projectOfferPackage */
$projectOfferPackage = $projectOfferPackageRepository->getProjectOfferPackageInCurrentMonth($project);
$data = $this->getProjectOfferPackageData($projectOfferPackage, $task->getId());
$data[$task->getId()]["status"] = OfferPackageTask::STATUS_NOT;
$data[$task->getId()]["reason"] = $request->get('reason');
$projectOfferPackage->setData($data);
$projectOfferPackageRepository->save($projectOfferPackage);
} else {
$taskObject = $taskRepository->findOneBy(["id" => $request->get('task')]);
}
$taskObject->setStatus(Task::STATUS_PAUSED)->setInfo($request->get('reason'));
$taskRepository->save($taskObject);
return $this->json([]);
}
/**
* @param ProjectOfferPackage $projectOfferPackage
* @param int $taskId
* @return array|null
*/
private function getProjectOfferPackageData(ProjectOfferPackage $projectOfferPackage, int $taskId): ?array
{
$data = $projectOfferPackage->getData();
if (!isset($data[$taskId])) {
$data[$taskId] = [];
}
return $data;
}
/**
* @param string $time
* @return float|string
*/
private function stringTimeToNumber(string $time)
{
if (preg_match('/:/', $time,)) {
return explode(":", $time)[0] + (explode(":", $time)[1] / 60);
}
return $time / 60;
}
}