merge prod to main
This commit is contained in:
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+44
@@ -4,6 +4,15 @@ namespace App\Models;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
/**
|
||||
* Weekly class progress reports (one row per subject per week).
|
||||
*
|
||||
* unit_title stores a compact summary of unit/chapter rows: segments joined with " ; ".
|
||||
* Teacher-entered custom Islamic or Quran topics use the prefix "Custom / {text}"
|
||||
* (see {@see \App\Controllers\ClassProgressController::CUSTOM_UNIT_ROW_LABEL} and
|
||||
* {@see \App\Controllers\ClassProgressController::splitUnitTitleForDisplay()}).
|
||||
* DB column is VARCHAR(120); controller truncates to match.
|
||||
*/
|
||||
class ClassProgressReportModel extends Model
|
||||
{
|
||||
protected $table = 'class_progress_reports';
|
||||
@@ -27,7 +36,42 @@ class ClassProgressReportModel extends Model
|
||||
'flags_json',
|
||||
'attachment_path',
|
||||
];
|
||||
|
||||
protected $useTimestamps = true;
|
||||
protected $createdField = 'created_at';
|
||||
protected $updatedField = 'updated_at';
|
||||
|
||||
/**
|
||||
* Validation is performed in {@see \App\Controllers\ClassProgressController} on HTTP input.
|
||||
* Rules below document schema limits and can be enabled if you set {@see $skipValidation} to false.
|
||||
*/
|
||||
protected $skipValidation = true;
|
||||
|
||||
protected $validationRules = [
|
||||
'class_section_id' => 'required|integer',
|
||||
'teacher_id' => 'required|integer',
|
||||
'week_start' => 'required|valid_date[Y-m-d]',
|
||||
'week_end' => 'required|valid_date[Y-m-d]',
|
||||
'subject' => 'required|string|max_length[160]',
|
||||
'unit_title' => 'permit_empty|string|max_length[120]',
|
||||
'covered' => 'permit_empty|string',
|
||||
'homework' => 'permit_empty|string',
|
||||
'assessment' => 'permit_empty|string',
|
||||
'status' => 'permit_empty|in_list[on_track,slightly_behind,behind]',
|
||||
'status_notes' => 'permit_empty|string|max_length[200]',
|
||||
'class_notes' => 'permit_empty|string',
|
||||
'next_week_plan' => 'permit_empty|string',
|
||||
'support_needed' => 'permit_empty|string',
|
||||
'flags_json' => 'permit_empty|string',
|
||||
'attachment_path' => 'permit_empty|string|max_length[255]',
|
||||
];
|
||||
|
||||
protected $validationMessages = [
|
||||
'unit_title' => [
|
||||
'max_length' => 'Unit and chapter summary cannot exceed 120 characters.',
|
||||
],
|
||||
'subject' => [
|
||||
'max_length' => 'Subject cannot exceed 160 characters.',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+6
-4
@@ -22,11 +22,13 @@ class ConfigurationModel extends Model
|
||||
*/
|
||||
public function getConfigValueByKey(string $key)
|
||||
{
|
||||
// Deterministic read in case historical duplicates exist
|
||||
$result = $this->where('config_key', $key)
|
||||
// Use a fresh builder to avoid stale state from shared model builder.
|
||||
$builder = $this->db->table($this->table);
|
||||
$result = $builder->where('config_key', $key)
|
||||
->orderBy('id', 'DESC')
|
||||
->first();
|
||||
return $result ? $result['config_value'] : null;
|
||||
->get(1)
|
||||
->getRowArray();
|
||||
return $result['config_value'] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+13
-1
@@ -15,8 +15,20 @@ class EventChargesModel extends Model
|
||||
'student_id',
|
||||
'participation',
|
||||
'charged',
|
||||
'waiver_signed',
|
||||
'event_paid',
|
||||
'event_payment_id',
|
||||
'class_section_id',
|
||||
'external_firstname',
|
||||
'external_lastname',
|
||||
'external_note',
|
||||
'external_parent_firstname',
|
||||
'external_parent_lastname',
|
||||
'external_parent_phone',
|
||||
'external_parent_email',
|
||||
'semester',
|
||||
'school_year',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'created_at',
|
||||
'updated_at'
|
||||
@@ -30,7 +42,7 @@ class EventChargesModel extends Model
|
||||
|
||||
public function getChargesWithEventInfo($parentId = null, $schoolYear = null, $semester = null)
|
||||
{
|
||||
$builder = $this->select('event_charges.*, events.event_name, events.amount')
|
||||
$builder = $this->select('event_charges.*, events.event_name, events.amount AS event_amount, events.description AS event_description')
|
||||
->join('events', 'events.id = event_charges.event_id', 'left');
|
||||
|
||||
if ($parentId) {
|
||||
|
||||
Regular → Executable
Regular → Executable
+68
-5
@@ -8,19 +8,51 @@ class ExamDraftModel extends Model
|
||||
{
|
||||
protected $table = 'exam_drafts';
|
||||
protected $primaryKey = 'id';
|
||||
protected $returnType = 'array';
|
||||
protected $useTimestamps = true;
|
||||
protected $createdField = 'created_at';
|
||||
protected $updatedField = 'updated_at';
|
||||
protected bool $updateOnlyChanged = false;
|
||||
|
||||
/** @var list<string> Stored in `status` column */
|
||||
public const STATUSES = [
|
||||
'submitted',
|
||||
'accepted',
|
||||
'review needed',
|
||||
'rejected',
|
||||
'canceled',
|
||||
'under review',
|
||||
'legacy',
|
||||
];
|
||||
|
||||
/** @var list<string> 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',
|
||||
@@ -29,9 +61,40 @@ class ExamDraftModel extends Model
|
||||
'version',
|
||||
'previous_draft_id',
|
||||
];
|
||||
protected $returnType = 'array';
|
||||
protected $useTimestamps = true;
|
||||
protected $createdField = 'created_at';
|
||||
protected $updatedField = 'updated_at';
|
||||
protected bool $updateOnlyChanged = false; // force updates even if CI thinks nothing changed
|
||||
|
||||
/**
|
||||
* 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<string, string>
|
||||
*/
|
||||
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',
|
||||
];
|
||||
}
|
||||
|
||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
+27
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use CodeIgniter\Model;
|
||||
|
||||
class ReportCardAcknowledgementModel extends Model
|
||||
{
|
||||
protected $table = 'report_card_acknowledgements';
|
||||
protected $primaryKey = 'id';
|
||||
protected $allowedFields = [
|
||||
'parent_id',
|
||||
'student_id',
|
||||
'school_year',
|
||||
'semester',
|
||||
'viewed_at',
|
||||
'signed_at',
|
||||
'signed_name',
|
||||
'signer_ip',
|
||||
'created_at',
|
||||
'updated_at',
|
||||
];
|
||||
protected $useTimestamps = true;
|
||||
protected $createdField = 'created_at';
|
||||
protected $updatedField = 'updated_at';
|
||||
protected $returnType = 'array';
|
||||
}
|
||||
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Regular → Executable
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user