lotteryAdmin(); abort_if($admin === null, 401); try { $agentProfileService->assertActorMayCreatePlayer($admin); } catch (\Illuminate\Validation\ValidationException $e) { return ApiMessage::errorResponse( $request, 'admin.player_create_capability_forbidden', ErrorCode::AdminForbidden->value, $e->errors(), 403, ); } $siteCode = (string) $request->validated('site_code'); if (! AdminSiteScope::siteCodeAllowed($admin, $siteCode)) { return ApiMessage::errorResponse($request, 'admin.player_create_site_forbidden', ErrorCode::AdminForbidden->value, null, 403); } $exists = Player::query() ->where('site_code', $request->validated('site_code')) ->where('site_player_id', $request->validated('site_player_id')) ->exists(); if ($exists) { return ApiMessage::errorResponse($request, 'admin.player_already_registered', ErrorCode::ValidationFailed->value, null, 422); } $agentNodeId = $admin->isSuperAdmin() ? $this->resolveAgentNodeIdForSuperAdmin($request->validated('agent_node_id'), $siteCode) : $admin->primaryAgentNodeId(); if ($agentNodeId === null) { return ApiMessage::errorResponse( $request, 'admin.player_create_agent_required', ErrorCode::ValidationFailed->value, null, 422, ); } if (! $admin->isSuperAdmin()) { $agent = AdminAgentScope::primaryAgentNode($admin); if ($agent === null || (int) $agentNodeId !== (int) $agent->id) { return ApiMessage::errorResponse($request, 'admin.player_create_agent_forbidden', ErrorCode::AdminForbidden->value, null, 403); } } $agent = AgentNode::query()->findOrFail($agentNodeId); if ($request->has('rebate_rate')) { $rebateLimitValidator->assertPlayerRebateWithinAgent( $agent, (float) $request->input('rebate_rate', 0), (float) $request->input('extra_rebate_rate', 0), ); } $player = Player::query()->create([ 'site_code' => $request->validated('site_code'), 'agent_node_id' => $agentNodeId, 'site_player_id' => $request->validated('site_player_id'), 'username' => $request->validated('username'), 'nickname' => $request->validated('nickname'), 'default_currency' => $request->validated('default_currency', 'NPR'), 'status' => $request->validated('status', 0), ]); if ($request->has('credit_limit')) { $playerCreditService->upsertAccount($player, [ 'credit_limit' => (int) $request->input('credit_limit', 0), ]); } if ($request->has('rebate_rate')) { \Illuminate\Support\Facades\DB::table('player_rebate_profiles')->insert([ 'player_id' => $player->id, 'game_type' => '*', 'inherit_from_agent' => false, 'rebate_rate' => (float) $request->input('rebate_rate', 0), 'extra_rebate_rate' => (float) $request->input('extra_rebate_rate', 0), 'created_at' => now(), 'updated_at' => now(), ]); } return ApiResponse::success(PlayerApiPresenter::listItem($player))->setStatusCode(201); } private function resolveAgentNodeIdForSuperAdmin(mixed $requested, string $siteCode): ?int { if ($requested !== null && (int) $requested > 0) { return (int) $requested; } $siteId = \App\Models\AdminSite::query()->where('code', $siteCode)->value('id'); if ($siteId === null) { return null; } $rootId = \App\Models\AgentNode::query() ->where('admin_site_id', (int) $siteId) ->where('depth', 0) ->value('id'); return $rootId !== null ? (int) $rootId : null; } }