Update schema to store accompanying period work referrer history

This commit is contained in:
Julien Fastré 2023-10-05 09:33:23 +02:00
parent 239372270e
commit 363785b779
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
3 changed files with 115 additions and 15 deletions

View File

@ -156,7 +156,7 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues
/**
* @var Collection<int, AccompanyingPeriodWorkReferrerHistory>
* @ORM\OneToMany(targetEntity=AccompanyingPeriodWorkReferrerHistory::class, cascade={"persist", "remove"}, mappedBy="accompanyingPeriodWork")
* @ORM\OneToMany(targetEntity=AccompanyingPeriodWorkReferrerHistory::class, cascade={"persist", "remove"}, mappedBy="accompanyingPeriodWork", orphanRemoval=true)
* @ORM\JoinTable(name="chill_person_accompanying_period_work_referrer")
*/
private Collection $referrersHistory;
@ -357,9 +357,17 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues
*/
public function getReferrers(): ReadableCollection
{
return $this->referrersHistory->map(fn (AccompanyingPeriodWorkReferrerHistory $h) => $h->getUser());
return $this->referrersHistory
->filter(fn (AccompanyingPeriodWorkReferrerHistory $h) => null === $h->getEndDate())
->map(fn (AccompanyingPeriodWorkReferrerHistory $h) => $h->getUser());
}
public function getReferrersHistory(): Collection
{
return $this->referrersHistory;
}
/**
* @return Collection<int, Result>
*/
@ -442,6 +450,7 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues
if ($history->isDateRangeEmpty()) {
$history->removeAccompanyingPeriodWork();
$this->referrersHistory->removeElement($history);
}
}
}

View File

@ -38,29 +38,24 @@ class AccompanyingPeriodWorkReferrerHistory implements TrackCreationInterface, T
* @var \DateTimeImmutable|null
* @ORM\Column(type="date_immutable", nullable=true, options={"default": null})
*/
private ?\DateTimeImmutable $endDate;
/**
* @var AccompanyingPeriodWork|null
* @ORM\ManyToOne(targetEntity=AccompanyingPeriodWork::class, inversedBy="referrersHistory")
*/
private ?AccompanyingPeriodWork $accompanyingPeriodWork;
private ?\DateTimeImmutable $endDate = null;
public function __construct(
AccompanyingPeriodWork $accompanyingPeriodWork,
/**
* @ORM\ManyToOne(targetEntity=AccompanyingPeriodWork::class, inversedBy="referrersHistory")
*/
private ?AccompanyingPeriodWork $accompanyingPeriodWork,
/**
* @var User
* @ORM\ManyToOne(targetEntity=User::class)
*/
private readonly User $user,
private User $user,
/**
* @var \DateTimeImmutable
* @ORM\Column(type="date_immutable", nullable=false)
*/
private readonly \DateTimeImmutable $startDate,
) {
$this->accompanyingPeriodWork = $accompanyingPeriodWork;
}
private \DateTimeImmutable $startDate
) {}
public function getId(): ?int
{

View File

@ -0,0 +1,96 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\PersonBundle\Tests\Entity\AccompanyingPeriod;
use Chill\MainBundle\Entity\User;
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkReferrerHistory;
use PHPUnit\Framework\TestCase;
/**
* @internal
* @coversNothing
*/
class AccompanyingPeriodWorkTest extends TestCase
{
public function testReferrerHistory(): void
{
$work = new AccompanyingPeriodWork();
$userA = new User();
$userB = new User();
$userC = new User();
self::assertCount(0, $work->getReferrers());
$work->addReferrer($userA);
self::assertCount(1, $work->getReferrers());
self::assertContains($userA, $work->getReferrers());
$work->addReferrer($userB);
self::assertCount(2, $work->getReferrers());
self::assertContains($userA, $work->getReferrers());
self::assertContains($userB, $work->getReferrers());
$work->addReferrer($userC);
$work->removeReferrer($userB);
self::assertCount(2, $work->getReferrers());
self::assertContains($userA, $work->getReferrers());
self::assertNotContains($userB, $work->getReferrers());
self::assertContains($userC, $work->getReferrers());
$work->removeReferrer($userA);
self::assertNotContains($userA, $work->getReferrers());
self::assertNotContains($userB, $work->getReferrers());
self::assertContains($userC, $work->getReferrers());
}
public function testReferrerHistoryOnDifferentDays(): void
{
$work = new AccompanyingPeriodWork();
$userA = new User();
$userB = new User();
$userC = new User();
$work->addReferrer($userA);
$historyA = $work->getReferrersHistory()->first();
$reflection = new \ReflectionClass($historyA);
$startDateReflection = $reflection->getProperty('startDate');
$startDateReflection->setAccessible(true);
$startDateReflection->setValue($historyA, new \DateTimeImmutable('1 year ago'));
$work->addReferrer($userB);
$work->addReferrer($userC);
$work->removeReferrer($userB);
$work->removeReferrer($userA);
self::assertCount(1, $work->getReferrers());
self::assertNotContains($userA, $work->getReferrers());
self::assertNotContains($userB, $work->getReferrers());
self::assertContains($userC, $work->getReferrers());
self::assertCount(2, $work->getReferrersHistory());
$historyA = $work->getReferrersHistory()
->filter(fn (AccompanyingPeriodWorkReferrerHistory $h) => $userA === $h->getUser())
->first();
self::assertNotFalse($historyA);
self::assertSame($userA, $historyA->getUser());
self::assertEquals((new \DateTimeImmutable())->format('Y-m-d'), $historyA->getEndDate()->format('Y-m-d'));
}
}