Files
lotteryLaravel/app/Services/Agent/RebateLimitValidator.php
kang 5b6d4cb74d feat: enhance agent management and validation logic
- Updated AGENTS.md to clarify agent account restrictions and permissions.
- Implemented checks in AgentNodeAdminUserStoreController and AgentNodeRoleStoreController to restrict admin user and role creation to the agent's own node.
- Enhanced validation in AdminPlayerStoreController and AdminPlayerUpdateController to enforce credit limit and rebate rate rules based on player funding mode.
- Refactored various request classes to utilize shared admin account field rules for consistency.
- Improved error handling in services related to credit allocation and rebate limits to ensure proper validation and messaging.
2026-06-14 21:13:27 +08:00

63 lines
2.0 KiB
PHP

<?php
namespace App\Services\Agent;
use App\Models\AgentNode;
use App\Models\AgentProfile;
use Illuminate\Validation\ValidationException;
final class RebateLimitValidator
{
public function assertPlayerRebateWithinAgent(AgentNode $agent, float $rebateRate, float $extraRebateRate = 0): void
{
$profile = AgentProfile::query()->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'],
]);
}
}
}