<?php
namespace App\Entity;
use App\Repository\CourseUserEnrollmentRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
#[ORM\Entity(repositoryClass: CourseUserEnrollmentRepository::class)]
class CourseUserEnrollment
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private $id;
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'courseUserEnrollments')]
#[Groups(['LogService'])]
private $user;
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
private $createdAt;
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
#[Groups(['LogService'])]
private $enrolledAt;
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
#[Groups(['LogService'])]
private $dueAt;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
#[Groups(['LogService'])]
private $status;
#[ORM\Column(type: 'string', length: 255)]
#[Groups(['LogService'])]
private $enrollType;
#[ORM\ManyToOne(targetEntity: Course::class, inversedBy: 'courseUserEnrollments')]
private $course;
#[ORM\OneToMany(targetEntity: CourseQuizResult::class, mappedBy: 'enrollment', cascade: ['remove'])]
private $courseQuizResults;
#[ORM\Column(type: 'json', nullable: true)]
private $attributes = [];
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
private $deletedAt;
#[ORM\Column(type: 'array', nullable: true)]
private $reminder = [];
public function __construct()
{
$this->courseQuizResults = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeImmutable $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getEnrolledAt(): ?\DateTimeImmutable
{
return $this->enrolledAt;
}
public function setEnrolledAt(\DateTimeImmutable $enrolledAt): self
{
$this->enrolledAt = $enrolledAt;
return $this;
}
public function getDueAt(): ?\DateTimeImmutable
{
return $this->dueAt;
}
public function setDueAt(?\DateTimeImmutable $dueAt): self
{
$this->dueAt = $dueAt;
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(?string $status): self
{
$this->status = $status;
return $this;
}
public function getEnrollType(): ?string
{
return $this->enrollType;
}
public function setEnrollType(string $enrollType): self
{
$this->enrollType = $enrollType;
return $this;
}
public function getCourse(): ?Course
{
return $this->course;
}
public function setCourse(?Course $course): self
{
$this->course = $course;
return $this;
}
/**
* @return Collection|CourseQuizResult[]
*/
public function getCourseQuizResults(): Collection
{
// return $this->courseQuizResults;
return $this->courseQuizResults->filter(function (CourseQuizResult $quizResult) {
return !$quizResult->isDeleted();
});
}
// /**
// * Get the courseQuizResults with status 'failed'.
// *
// * @return Collection|CourseQuizResult[]
// */
// public function getFailedCourseQuizResults(): Collection
// {
// return $this->courseQuizResults->filter(function (CourseQuizResult $quizResult) {
// return $quizResult->getStatus() === 'failed' && !$quizResult->isDeleted();
// });
// }
/**
* Get the count of courseQuizResults with status 'failed'.
*
* @return int
*/
public function getFailedCourseQuizResultsCount(): int
{
return $this->courseQuizResults->filter(function (CourseQuizResult $quizResult) {
return $quizResult->getStatus() === 'failed' && !$quizResult->isDeleted();
})->count();
}
public function addCourseQuizResult(CourseQuizResult $courseQuizResult): self
{
if (!$this->courseQuizResults->contains($courseQuizResult)) {
$this->courseQuizResults[] = $courseQuizResult;
$courseQuizResult->setEnrollment($this);
}
return $this;
}
public function removeCourseQuizResult(CourseQuizResult $courseQuizResult): self
{
/*
if ($this->courseQuizResults->removeElement($courseQuizResult)) {
// set the owning side to null (unless already changed)
if ($courseQuizResult->getEnrollment() === $this) {
$courseQuizResult->setEnrollment(null);
}
}
*/
if (!$courseQuizResult->isDeleted()) {
$courseQuizResult->setDeletedAt(new \DateTimeImmutable());
}
return $this;
}
/**
* Get the latest course quiz result for this enrollment.
*
* @return CourseQuizResult|null The latest course quiz result or null if none found.
*/
public function getLatestCourseQuizResult($status = null): ?CourseQuizResult
{
$latestQuizResult = null;
$latestCreatedAt = null;
/*
foreach ($this->courseQuizResults as $quizResult) {
$quizResultCreatedAt = $quizResult->getCreatedAt();
if (!$latestCreatedAt || $quizResultCreatedAt > $latestCreatedAt) {
$latestQuizResult = $quizResult;
$latestCreatedAt = $quizResultCreatedAt;
}
}
*/
foreach ($this->courseQuizResults as $quizResult) {
if (!$quizResult->isDeleted() && ($status === null || $quizResult->getStatus() == $status)) {
$quizResultCreatedAt = $quizResult->getCreatedAt();
if (!$latestCreatedAt || $quizResultCreatedAt > $latestCreatedAt) {
$latestQuizResult = $quizResult;
$latestCreatedAt = $quizResultCreatedAt;
}
}
}
return $latestQuizResult;
}
public function getAttributes(): ?array
{
return $this->attributes;
}
public function setAttributes(?array $attributes): self
{
$this->attributes = $attributes;
return $this;
}
public function getDeletedAt(): ?\DateTimeImmutable
{
return $this->deletedAt;
}
/**
* Check if the CourseQuizResult has been soft deleted.
*
* @return bool
*/
public function isDeleted(): bool
{
return $this->deletedAt !== null;
}
public function setDeletedAt(?\DateTimeImmutable $deletedAt): self
{
$this->deletedAt = $deletedAt;
return $this;
}
public function getReminder(): ?array
{
return $this->reminder;
}
public function setReminder(?array $reminder): self
{
$this->reminder = $reminder;
return $this;
}
}