Update project calendar when it goes in_campaign
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user