feat(backend) : add project relation to TaskStatus entity with migration and fixtures

Add ManyToOne project field on TaskStatus, SearchFilter for API filtering,
migration to add the column, and update fixtures to create statuses per project.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 21:58:41 +01:00
parent 50ae9ef549
commit 66bb94fc98
4 changed files with 83 additions and 336 deletions

View File

@@ -89,36 +89,36 @@ class AppFixtures extends Fixture
$projectInterne->setClient(null);
$manager->persist($projectInterne);
// Task Statuses
$statusTodo = new TaskStatus();
$statusTodo->setLabel('A faire');
$statusTodo->setColor('#222783');
$statusTodo->setPosition(0);
$manager->persist($statusTodo);
// Task Statuses (per project)
$defaultStatuses = [
['A faire', '#222783', 0],
['En cours', '#4A90D9', 1],
['Bloqué', '#C62828', 2],
['En attente de validation', '#FF8F00', 3],
['Terminé', '#26A69A', 4],
];
$statusInProgress = new TaskStatus();
$statusInProgress->setLabel('En cours');
$statusInProgress->setColor('#222783');
$statusInProgress->setPosition(1);
$manager->persist($statusInProgress);
$statusesByProject = [];
foreach ([$projectSirh, $projectCrm, $projectErp, $projectInterne] as $proj) {
$projectStatuses = [];
foreach ($defaultStatuses as [$label, $color, $position]) {
$status = new TaskStatus();
$status->setLabel($label);
$status->setColor($color);
$status->setPosition($position);
$status->setProject($proj);
$manager->persist($status);
$projectStatuses[$label] = $status;
}
$statusesByProject[spl_object_id($proj)] = $projectStatuses;
}
$statusBlocked = new TaskStatus();
$statusBlocked->setLabel('Bloqué');
$statusBlocked->setColor('#222783');
$statusBlocked->setPosition(2);
$manager->persist($statusBlocked);
$statusReview = new TaskStatus();
$statusReview->setLabel('En attente de validation');
$statusReview->setColor('#222783');
$statusReview->setPosition(3);
$manager->persist($statusReview);
$statusDone = new TaskStatus();
$statusDone->setLabel('Terminé');
$statusDone->setColor('#222783');
$statusDone->setPosition(4);
$manager->persist($statusDone);
$sirhStatuses = $statusesByProject[spl_object_id($projectSirh)];
$statusTodo = $sirhStatuses['A faire'];
$statusInProgress = $sirhStatuses['En cours'];
$statusBlocked = $sirhStatuses['Bloqué'];
$statusReview = $sirhStatuses['En attente de validation'];
$statusDone = $sirhStatuses['Terminé'];
// Task Efforts
$effortS = new TaskEffort();

View File

@@ -4,6 +4,8 @@ declare(strict_types=1);
namespace App\Entity;
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Delete;
use ApiPlatform\Metadata\Get;
@@ -26,6 +28,7 @@ use Symfony\Component\Serializer\Attribute\Groups;
denormalizationContext: ['groups' => ['task_status:write']],
order: ['position' => 'ASC'],
)]
#[ApiFilter(SearchFilter::class, properties: ['project' => 'exact'])]
#[ORM\Entity(repositoryClass: TaskStatusRepository::class)]
class TaskStatus
{
@@ -47,6 +50,11 @@ class TaskStatus
#[Groups(['task_status:read', 'task_status:write', 'task:read'])]
private ?int $position = 0;
#[ORM\ManyToOne(targetEntity: Project::class)]
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
#[Groups(['task_status:read', 'task_status:write'])]
private ?Project $project = null;
public function getId(): ?int
{
return $this->id;
@@ -87,4 +95,16 @@ class TaskStatus
return $this;
}
public function getProject(): ?Project
{
return $this->project;
}
public function setProject(?Project $project): static
{
$this->project = $project;
return $this;
}
}