Stored in `status` column */ public const STATUSES = [ 'submitted', 'accepted', 'review needed', 'rejected', 'canceled', 'under review', 'legacy', ]; /** @var list Stored in `acceptance_type` when status is finalized */ public const ACCEPTANCE_TYPES = [ 'as_is', 'minor_edits', ]; protected $allowedFields = [ 'teacher_id', 'author_id', 'class_section_id', 'semester', 'school_year', 'exam_type', 'draft_title', 'author_comment', 'description', 'teacher_file', 'teacher_filename', 'author_file', 'author_filename', 'status', 'acceptance_type', 'review_revision', 'reviewer_id', 'admin_id', 'is_legacy', 'reviewer_comment', 'reviewer_comments', 'admin_comments', 'reviewed_at', 'final_file', 'final_filename', 'final_pdf_file', 'version', 'previous_draft_id', ]; /** * Applied on insert/update when validation runs (e.g. $model->insert($data, true)). * Uses if_exist so partial updates still validate only keys present in $data. */ protected $validationRules = [ 'status' => 'if_exist|in_list[submitted,accepted,review needed,rejected,canceled,under review,legacy]', 'acceptance_type' => 'if_exist|permit_empty|in_list[as_is,minor_edits]', 'author_id' => 'if_exist|is_natural_no_zero', 'class_section_id' => 'if_exist|is_natural_no_zero', 'version' => 'if_exist|is_natural_no_zero', ]; protected $validationMessages = [ 'status' => [ 'in_list' => 'Invalid exam draft status.', ], 'acceptance_type' => [ 'in_list' => 'Acceptance must be as_is or minor_edits.', ], ]; /** * @var array */ protected array $casts = [ 'teacher_id' => 'int', 'author_id' => 'int', 'class_section_id' => 'int', 'reviewer_id' => '?int', 'admin_id' => '?int', 'review_revision' => 'int', 'version' => 'int', 'previous_draft_id' => '?int', 'is_legacy' => 'boolean', ]; }