where('agent_node_id', $agent->id)->first(); if ($profile === null) { throw ValidationException::withMessages([ 'rebate_rate' => ['agent_profile_required'], ]); } // Both $rebateRate and $profile->rebate_limit are ratios (0-1) $limit = (float) $profile->rebate_limit; if ($rebateRate > $limit) { throw ValidationException::withMessages([ 'rebate_rate' => ['exceeds_limit'], ]); } if ($extraRebateRate > $limit) { throw ValidationException::withMessages([ 'extra_rebate_rate' => ['exceeds_limit'], ]); } if ($extraRebateRate > 0 && ! $profile->can_grant_extra_rebate) { throw ValidationException::withMessages([ 'extra_rebate_rate' => ['not_allowed'], ]); } if ($limit > 0 && ($rebateRate + $extraRebateRate) > $limit + 1e-9) { throw ValidationException::withMessages([ 'rebate_rate' => ['exceeds_limit'], ]); } } public function assertChildRebateLimitWithinParent(AgentNode $parent, float $childRebateLimitRatio): void { $profile = AgentProfile::query()->where('agent_node_id', $parent->id)->first(); if ($profile === null) { throw ValidationException::withMessages([ 'rebate_limit' => ['parent_profile_required'], ]); } if ($childRebateLimitRatio > (float) $profile->rebate_limit) { throw ValidationException::withMessages([ 'rebate_limit' => ['exceeds_parent'], ]); } } }