'required|string|max_length[9]', ]; protected $useTimestamps = true; protected $createdField = 'created_at'; protected $updatedField = 'updated_at'; private array $refundColumns = []; public function __construct(?ConnectionInterface $db = null, ?ValidationInterface $validation = null) { parent::__construct($db, $validation); $this->refundColumns = $this->getTableColumns($this->table); $this->allowedFields = array_values(array_filter( $this->allowedFields, fn (string $field): bool => in_array($field, $this->refundColumns, true) )); foreach (array_keys($this->validationRules) as $field) { if (!in_array($field, $this->allowedFields, true)) { unset($this->validationRules[$field]); } } } private function getTableColumns(string $table): array { try { return $this->db->getFieldNames($table); } catch (\Throwable $e) { log_message('error', '[RefundModel] Could not read table columns for {table}: {error}', [ 'table' => $table, 'error' => $e->getMessage(), ]); return []; } } /** * Get total approved refund for a parent in a specific school year. * * @param int $parentId * @param string $schoolYear * @return float */ public function getTotalApprovedRefundByParentIdAndSchoolYear(int $parentId, string $schoolYear): float { // Sum refunds that have been at least partially paid out to the parent $result = $this->selectSum('refund_paid_amount', 'total_paid') ->where('parent_id', $parentId) ->where('school_year', $schoolYear) ->whereIn('status', ['Partial', 'Paid']) ->get() ->getRowArray(); return $result && isset($result['total_paid']) ? (float) $result['total_paid'] : 0.00; } }