*/ public const VALID_STATUSES = [ self::STATUS_ACTIVE, self::STATUS_CANCELLED, self::STATUS_COMPLETED ]; public function __construct( public readonly int $offeringId, public readonly int $studentId, public readonly int $instructorId, public readonly string $status = self::STATUS_ACTIVE, public readonly ?int $paymentId = null, /** * The staff member who enrolled this student from wp-admin — the class * detail page's **Add students directly**; 0 when the student or their * guardian enrolled themselves. It is what marks an enrolment whose intake * answers and policy acceptances may be recorded after the fact, nobody * having been at a keyboard to give them at the time. */ public readonly int $enrolledBy = 0, public readonly ?int $id = null, ) {} public function intakeRegistrationType(): string { return Answer::REG_ENROLLMENT; } /** * An enrolment is registered once and is its own registration — there is no * series anchor to follow, as a term of classes is one enrolment. */ public function intakeRegistrationId(): int { return (int) $this->id; } public function intakeOfferingId(): int { return $this->offeringId; } public function intakeStudentId(): int { return $this->studentId; } /** * Whether the studio enrolled this student, rather than the student (or their * guardian) enrolling themselves. */ public function isStaffRegistered(): bool { return $this->enrolledBy > 0; } public static function fromRow( \stdClass $row ): self { return new self( offeringId: Val::int( $row->offering_id ), studentId: Val::int( $row->student_id ), instructorId: Val::int( $row->instructor_id ), status: Val::string( $row->status ), paymentId: Val::intOrNull( $row->payment_id ), enrolledBy: Val::int( $row->enrolled_by ?? 0 ), id: Val::int( $row->id ), ); } /** * Returns a plain array representation of the enrolment. * * @return array */ public function toArray(): array { return [ 'id' => $this->id, 'offering_id' => $this->offeringId, 'student_id' => $this->studentId, 'instructor_id' => $this->instructorId, 'status' => $this->status, 'payment_id' => $this->paymentId, 'enrolled_by' => $this->enrolledBy, ]; } }