diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20170625123000.php b/src/CoreBundle/Migrations/Schema/V200/Version20170625123000.php index f81a4e89f5..04521c8eb7 100644 --- a/src/CoreBundle/Migrations/Schema/V200/Version20170625123000.php +++ b/src/CoreBundle/Migrations/Schema/V200/Version20170625123000.php @@ -76,7 +76,7 @@ class Version20170625123000 extends AbstractMigrationChamilo } if (false === $table->hasForeignKey('FK_AD1394FA19EA43C3')) { - $this->addSql('ALTER TABLE c_attendance_sheet ADD CONSTRAINT FK_AD1394FA19EA43C3 FOREIGN KEY (attendance_calendar_id) REFERENCES c_attendance_calendar (iid);'); + $this->addSql('ALTER TABLE c_attendance_sheet ADD CONSTRAINT FK_AD1394FA19EA43C3 FOREIGN KEY (attendance_calendar_id) REFERENCES c_attendance_calendar (iid) ON DELETE CASCADE'); } if (false === $table->hasIndex('IDX_AD1394FA19EA43C3')) { @@ -148,7 +148,7 @@ class Version20170625123000 extends AbstractMigrationChamilo $this->addSql('ALTER TABLE c_attendance_result ADD CONSTRAINT FK_2C7640A76ED395 FOREIGN KEY (user_id) REFERENCES user (id);'); } if (false === $table->hasForeignKey('FK_2C7640163DDA15')) { - $this->addSql('ALTER TABLE c_attendance_result ADD CONSTRAINT FK_2C7640163DDA15 FOREIGN KEY (attendance_id) REFERENCES c_attendance (iid);'); + $this->addSql('ALTER TABLE c_attendance_result ADD CONSTRAINT FK_2C7640163DDA15 FOREIGN KEY (attendance_id) REFERENCES c_attendance (iid) ON DELETE CASCADE'); } if (false === $table->hasIndex('IDX_2C7640A76ED395')) { $this->addSql('CREATE INDEX IDX_2C7640A76ED395 ON c_attendance_result (user_id);'); diff --git a/src/CourseBundle/Entity/CAttendance.php b/src/CourseBundle/Entity/CAttendance.php index 829ab01837..9b6fc46faf 100644 --- a/src/CourseBundle/Entity/CAttendance.php +++ b/src/CourseBundle/Entity/CAttendance.php @@ -76,6 +76,13 @@ class CAttendance extends AbstractResource implements ResourceInterface */ protected Collection $calendars; + /** + * @var Collection|CAttendanceResult[] + * + * @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CAttendanceResult", mappedBy="attendance", cascade={"persist", "remove"}) + */ + protected Collection $results; + /** * @var Collection|CAttendanceSheetLog[] * @@ -90,6 +97,7 @@ class CAttendance extends AbstractResource implements ResourceInterface $this->attendanceQualifyMax = 0; $this->locked = 0; $this->calendars = new ArrayCollection(); + $this->results = new ArrayCollection(); $this->logs = new ArrayCollection(); } @@ -232,6 +240,21 @@ class CAttendance extends AbstractResource implements ResourceInterface return $this; } + /** + * @return CAttendanceResult[]|Collection + */ + public function getResults() + { + return $this->results; + } + + public function setResults(Collection $results): self + { + $this->results = $results; + + return $this; + } + public function getResourceIdentifier(): int { return $this->getIid(); diff --git a/src/CourseBundle/Entity/CAttendanceCalendar.php b/src/CourseBundle/Entity/CAttendanceCalendar.php index 56c05516e0..829d3c231b 100644 --- a/src/CourseBundle/Entity/CAttendanceCalendar.php +++ b/src/CourseBundle/Entity/CAttendanceCalendar.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace Chamilo\CourseBundle\Entity; use DateTime; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; /** @@ -43,6 +44,13 @@ class CAttendanceCalendar */ protected bool $doneAttendance; + /** + * @var Collection|CAttendanceSheet[] + * + * @ORM\OneToMany(targetEntity="CAttendanceSheet", mappedBy="attendanceCalendar", cascade={"persist", "remove"}) + */ + protected Collection $sheets; + public function getIid(): int { return $this->iid; @@ -88,4 +96,22 @@ class CAttendanceCalendar { return $this->doneAttendance; } + + /** + * @return CAttendanceSheet[]|Collection + */ + public function getSheets() + { + return $this->sheets; + } + + /** + * @param CAttendanceSheet[]|Collection $sheets + */ + public function setSheets(Collection $sheets): self + { + $this->sheets = $sheets; + + return $this; + } } diff --git a/src/CourseBundle/Entity/CAttendanceResult.php b/src/CourseBundle/Entity/CAttendanceResult.php index 4582b92d2f..a17a35fde8 100644 --- a/src/CourseBundle/Entity/CAttendanceResult.php +++ b/src/CourseBundle/Entity/CAttendanceResult.php @@ -10,8 +10,6 @@ use Chamilo\CoreBundle\Entity\User; use Doctrine\ORM\Mapping as ORM; /** - * CAttendanceResult. - * * @ORM\Table( * name="c_attendance_result", * indexes={ @@ -35,8 +33,8 @@ class CAttendanceResult protected User $user; /** - * @ORM\ManyToOne(targetEntity="Chamilo\CourseBundle\Entity\CAttendance") - * @ORM\JoinColumn(name="attendance_id", referencedColumnName="iid") + * @ORM\ManyToOne(targetEntity="Chamilo\CourseBundle\Entity\CAttendance", inversedBy="results") + * @ORM\JoinColumn(name="attendance_id", referencedColumnName="iid", onDelete="CASCADE") */ protected CAttendance $attendance; diff --git a/src/CourseBundle/Entity/CAttendanceSheet.php b/src/CourseBundle/Entity/CAttendanceSheet.php index f7b17b9538..56d549eb21 100644 --- a/src/CourseBundle/Entity/CAttendanceSheet.php +++ b/src/CourseBundle/Entity/CAttendanceSheet.php @@ -10,8 +10,6 @@ use Chamilo\CoreBundle\Entity\User; use Doctrine\ORM\Mapping as ORM; /** - * CAttendanceSheet. - * * @ORM\Table( * name="c_attendance_sheet", * indexes={ @@ -41,8 +39,8 @@ class CAttendanceSheet protected User $user; /** - * @ORM\ManyToOne(targetEntity="Chamilo\CourseBundle\Entity\CAttendanceCalendar") - * @ORM\JoinColumn(name="attendance_calendar_id", referencedColumnName="iid") + * @ORM\ManyToOne(targetEntity="Chamilo\CourseBundle\Entity\CAttendanceCalendar", inversedBy="sheets") + * @ORM\JoinColumn(name="attendance_calendar_id", referencedColumnName="iid", onDelete="CASCADE") */ protected CAttendanceCalendar $attendanceCalendar; @@ -53,12 +51,7 @@ class CAttendanceSheet return $this; } - /** - * Get presence. - * - * @return bool - */ - public function getPresence() + public function getPresence(): bool { return $this->presence; } diff --git a/tests/CourseBundle/Repository/CAttendanceRepositoryTest.php b/tests/CourseBundle/Repository/CAttendanceRepositoryTest.php index ccf947c235..56c210007f 100644 --- a/tests/CourseBundle/Repository/CAttendanceRepositoryTest.php +++ b/tests/CourseBundle/Repository/CAttendanceRepositoryTest.php @@ -8,9 +8,13 @@ namespace Chamilo\Tests\CourseBundle\Repository; use Chamilo\CoreBundle\Repository\Node\CourseRepository; use Chamilo\CourseBundle\Entity\CAttendance; +use Chamilo\CourseBundle\Entity\CAttendanceCalendar; +use Chamilo\CourseBundle\Entity\CAttendanceResult; +use Chamilo\CourseBundle\Entity\CAttendanceSheet; use Chamilo\CourseBundle\Repository\CAttendanceRepository; use Chamilo\Tests\AbstractApiTest; use Chamilo\Tests\ChamiloTestTrait; +use DateTime; class CAttendanceRepositoryTest extends AbstractApiTest { @@ -18,8 +22,6 @@ class CAttendanceRepositoryTest extends AbstractApiTest public function testCreate(): void { - self::bootKernel(); - $em = $this->getEntityManager(); $courseRepo = self::getContainer()->get(CourseRepository::class); @@ -30,6 +32,12 @@ class CAttendanceRepositoryTest extends AbstractApiTest $item = (new CAttendance()) ->setName('item') + ->setResourceName('item') + ->setDescription('desc') + ->setLocked(1) + ->setActive(1) + ->setAttendanceQualifyMax(100) + ->setAttendanceQualifyTitle('title') ->setAttendanceWeight(100) ->setParent($course) ->setCreator($teacher) @@ -39,9 +47,84 @@ class CAttendanceRepositoryTest extends AbstractApiTest $em->flush(); $this->assertSame('item', (string) $item); + $this->assertSame($item->getResourceIdentifier(), $item->getIid()); $this->assertSame(1, $repo->count([])); - $courseRepo->delete($course); $this->assertSame(0, $repo->count([])); } + + public function testCreateWithCalendar(): void + { + $em = $this->getEntityManager(); + + $courseRepo = self::getContainer()->get(CourseRepository::class); + $attendanceRepo = self::getContainer()->get(CAttendanceRepository::class); + $calendarRepo = $em->getRepository(CAttendanceCalendar::class); + $resultRepo = $em->getRepository(CAttendanceResult::class); + $sheetRepo = $em->getRepository(CAttendanceSheet::class); + + $course = $this->createCourse('new'); + $teacher = $this->createUser('teacher'); + $student = $this->createUser('student'); + + $attendance = (new CAttendance()) + ->setName('item') + ->setAttendanceWeight(100) + ->setParent($course) + ->setCreator($teacher) + ; + $em->persist($attendance); + + $calendar = (new CAttendanceCalendar()) + ->setAttendance($attendance) + ->setDateTime(new DateTime()) + ->setDoneAttendance(true) + ; + $em->persist($calendar); + + $result = (new CAttendanceResult()) + ->setAttendance($attendance) + ->setUser($student) + ->setScore(100) + ; + $em->persist($result); + + $sheet = (new CAttendanceSheet()) + ->setUser($student) + ->setAttendanceCalendar($calendar) + ->setPresence(true) + ; + $em->persist($sheet); + $em->flush(); + $em->clear(); + + /** @var CAttendanceCalendar $calendar */ + $calendar = $calendarRepo->find($calendar->getIid()); + + $this->assertNotNull($calendar->getDateTime()); + $this->assertNotNull($calendar->getDoneAttendance()); + $this->assertNotNull($calendar->getAttendance()); + $this->assertSame(1, $calendar->getSheets()->count()); + + /** @var CAttendance $attendance */ + $attendance = $attendanceRepo->find($attendance->getIid()); + + $course = $this->getCourse($course->getId()); + + $this->assertSame(1, $attendance->getCalendars()->count()); + $this->assertSame(1, $attendance->getResults()->count()); + + $this->assertSame($attendance->getResourceIdentifier(), $attendance->getIid()); + + $this->assertSame(1, $attendanceRepo->count([])); + $this->assertSame(1, $calendarRepo->count([])); + $this->assertSame(1, $resultRepo->count([])); + $this->assertSame(1, $sheetRepo->count([])); + + $courseRepo->delete($course); + + $this->assertSame(0, $attendanceRepo->count([])); + $this->assertSame(0, $calendarRepo->count([])); + $this->assertSame(0, $sheetRepo->count([])); + } }