'required|integer', 'school_year' => 'required|string|max_length[9]', 'amount_cents' => 'required|integer|greater_than[0]', 'currency' => 'required|exact_length[3]', 'payout_type' => 'required|in_list[cash_out,account_credit,reversal]', 'status' => 'required|max_length[30]', 'idempotency_key' => 'required|max_length[100]', 'operation_type' => 'permit_empty|max_length[50]', 'request_fingerprint_hash' => 'permit_empty|exact_length[64]', ]; private array $refundPayoutColumns = []; public function __construct(?ConnectionInterface $db = null, ?ValidationInterface $validation = null) { parent::__construct($db, $validation); $this->refundPayoutColumns = $this->getTableColumns($this->table); $this->allowedFields = array_values(array_filter( $this->allowedFields, fn (string $field): bool => in_array($field, $this->refundPayoutColumns, 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', '[RefundPayoutModel] Could not read table columns for {table}: {error}', [ 'table' => $table, 'error' => $e->getMessage(), ]); return []; } } }