Update project calendar when it goes in_campaign

This commit is contained in:
2025-03-05 16:07:05 +01:00
parent 7c048ca8b0
commit ca50bb7edb
3 changed files with 73 additions and 1 deletions
+37
View File
@@ -0,0 +1,37 @@
<?php
namespace App\EventListener;
use App\Entity\Project\Project;
use App\Entity\Project\ProjectStatus;
use App\Service\Project\CalendarService;
use Doctrine\Bundle\DoctrineBundle\Attribute\AsEntityListener;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Doctrine\ORM\Events;
#[AsEntityListener(
event: Events::preUpdate,
method: 'preUpdate',
entity: Project::class
)]
final class ProjectsListener
{
public function __construct(
private CalendarService $calendarService,
) {}
public function preUpdate(
Project $project,
PreUpdateEventArgs $event,
) {
if (!$event->hasChangedField('status')) {
return;
}
if ($project->getStatus() === ProjectStatus::InCampaign) {
$calendar = $this->calendarService->makeCalendar($project);
$project->setCalendar($calendar);
}
}
}
+35
View File
@@ -0,0 +1,35 @@
<?php
namespace App\Service\Project;
use App\Entity\Project\Project;
use App\Entity\Project\ProjectCalendar;
use App\Entity\Project\ProjectDeadline;
class CalendarService
{
public function makeCalendar(
Project $project,
int $minimumTtl = 40,
int $optimumTtl = 40,
): ProjectCalendar {
$release = new \DateTimeImmutable();
$minimumTtl = \DateInterval::createFromDateString(\sprintf('%d days', $minimumTtl));
$optimumTtl = \DateInterval::createFromDateString(\sprintf('%d days', $optimumTtl));
$calendar = new ProjectCalendar();
$calendar->release = $release;
switch ($project->getDeadline()) {
case ProjectDeadline::Minimum:
$calendar->minimum = $release->add($minimumTtl);
break;
case ProjectDeadline::Optimum:
$calendar->minimum = $release->add($minimumTtl);
$calendar->optimum = $calendar->minimum->add($optimumTtl);
break;
}
return $calendar;
}
}
+1 -1
View File
@@ -23,7 +23,7 @@ class ProjectStateProcessor implements ProcessorInterface
/**
* @param ProjectCreateDto|ProjectUpdateDto $data
* @param array{id: int} $uriVariables
* @param array{id: int} $uriVariables
*
* @return ProjectApiResource|null
*/