public function filter(Request $request)
{
$reservationId = $request->input('reservation_name', []);
$lockId = $request->input('lock_name', []);
$activityId = $request->input('activity_name');
$statuId = $request->input('label_name', []);
$startDate = $request->input('start_name');
$endDate = $request->input('end_name');
$poolId = $request->input('pool_name', []);
$userId = $request->input('user_name', []);
$cityId = $request->input('city_name', []);
$gameId = $request->input('game_name', []);
$payId = $request->input('pay_name', []);
$approvedId = $request->input('approved_name', []);
$searchId = $request->input('searchInput');
$query = PoolCustomer::query();
$eagerLoadRelations = ['lock', 'statu', 'label', 'pool', 'user', 'tempCustomerData'];
if ($userId) {
$query->whereExists(function ($subQuery) use ($userId) {
$subQuery->select(DB::raw(1))
->from('user_partner_customer')
->whereRaw('user_partner_customer.customer_id = pool_customer.id')
->whereIn('user_partner_customer.user_id', (array)$userId);
});
}
if ($startDate && $endDate) {
$query->whereExists(function ($subQuery) use ($startDate, $endDate, $userId) {
$subQuery->select(DB::raw(1))
->from('user_customer_reservation')
->whereRaw('user_customer_reservation.customer_id = pool_customer.id')
->whereBetween('user_customer_reservation.start_date_reserve', [$startDate, $endDate])
->whereNull('user_customer_reservation.deleted_at');
if ($userId) {
$subQuery->whereIn('user_customer_reservation.user_id', (array)$userId);
}
});
}
if ($cityId) {
$query->whereExists(function ($subQuery) use ($cityId, $userId) {
$subQuery->select(DB::raw(1))
->from('user_customer_details')
->whereRaw('user_customer_details.customer_id = pool_customer.id')
->whereIn('user_customer_details.city_id', (array)$cityId);
if ($userId) {
$subQuery->whereIn('user_customer_details.user_id', (array)$userId);
}
});
}
if ($searchId) {
$query->where('pool_customer.customer_name', 'LIKE', '%' . $searchId . '%');
if ($userId) {
$query->where(function ($q) use ($userId) {
$q->whereIn('pool_customer.user_id', (array)$userId);
});
}
}
if ($payId) {
$query->whereExists(function ($subQuery) use ($payId, $userId) {
$subQuery->select(DB::raw(1))
->from('user_customer_details')
->whereRaw('user_customer_details.customer_id = pool_customer.id')
->whereIn('user_customer_details.pay_label_id', (array)$payId);
if ($userId) {
$subQuery->whereIn('user_customer_details.user_id', (array)$userId);
}
});
}
if ($reservationId) {
$query->whereExists(function ($subQuery) use ($reservationId, $userId) {
$subQuery->select(DB::raw(1))
->from('user_customer_reservation')
->whereNull('user_customer_reservation.deleted_at')
->whereRaw('user_customer_reservation.customer_id = pool_customer.id')
->whereIn('user_customer_reservation.reserve_id', (array)$reservationId);
if ($userId) {
$subQuery->whereIn('user_customer_reservation.user_id', (array)$userId);
}
});
}
if ($poolId) {
$query->whereIn('pool_customer.pool_id', (array)$poolId);
if ($userId) {
$query->where(function ($q) use ($userId) {
$q->whereIn('pool_customer.user_id', (array)$userId);
});
}
}
if ($lockId) {
$query->whereIn('pool_customer.lock_id', (array)$lockId);
if ($userId) {
$query->where(function ($q) use ($userId) {
$q->whereIn('pool_customer.user_id', (array)$userId);
});
}
}
if ($activityId) {
$query->where('pool_customer.activity_status_id', $activityId);
if ($userId) {
$query->where(function ($q) use ($userId) {
$q->whereIn('pool_customer.user_id', (array)$userId);
});
}
}
if ($statuId) {
$query->whereExists(function ($subQuery) use ($statuId, $userId) {
$subQuery->select(DB::raw(1))
->from('user_customer_statu')
->whereRaw('user_customer_statu.customer_id = pool_customer.id')
->whereNull('user_customer_statu.deleted_at')
->whereIn('user_customer_statu.statu_id', (array)$statuId);
if ($userId) {
$subQuery->where('user_customer_statu.user_id', $userId);
}
});
}
if ($approvedId) {
$query->whereIn('pool_customer.is_approved', (array)$approvedId);
if ($userId) {
$query->where(function ($q) use ($userId) {
$q->whereIn('pool_customer.user_id', (array)$userId);
});
}
}
if ($gameId) {
$query->whereExists(function ($subQuery) use ($gameId, $userId) {
$subQuery->select(DB::raw(1))
->from('customer_game_label')
->whereRaw('customer_game_label.customer_id = pool_customer.id')
->whereIn('customer_game_label.game_id', (array)$gameId);
if ($userId) {
$subQuery->whereIn('customer_game_label.user_id', (array)$userId);
}
});
}
$result = $query->with($eagerLoadRelations)
->orderBy('updated_at', 'desc');
$customerIds = $result->pluck('id')->toArray();
$customerReservationsMap = DB::table('user_customer_reservation')
->select('customer_id', 'reserve_id', 'start_date_reserve')
->whereNull('deleted_at')
->whereIn('customer_id', $customerIds)
->where('is_completed', 0)
->orderBy('created_at', 'desc')
->get()
->groupBy('customer_id');
$reserveIds = $customerReservationsMap->flatten(1)->pluck('reserve_id')->unique()->toArray();
$reservationNames = DB::table('reservation')
->whereIn('id', $reserveIds)
->select('id', 'reservation_name')
->get()
->keyBy('id');
$query2 = TepmCustomerData::query();
foreach ($customerIds as $id) {
$query2->orWhereJsonContains('customer_ids', (string) $id);
}
$tempCustomerDataList = $query2->get();
$callCountsMap = DB::table('call_record')
->select('customer_id', DB::raw('count(*) as total_calls'))
->whereIn('customer_id', $customerIds)
->groupBy('customer_id')
->get()
->keyBy('customer_id');
$callDetailsMap = DB::table('call_record')
->join('users', 'call_record.user_id', '=', 'users.id')
->select(
'call_record.customer_id',
'call_record.user_id',
'users.first_name',
'users.last_name',
DB::raw('count(*) as user_call_count')
)
->whereIn('call_record.customer_id', $customerIds)
->groupBy('call_record.customer_id', 'call_record.user_id', 'users.first_name', 'users.last_name')
->get()
->groupBy('customer_id');
$statusUsersQuery = DB::table('user_customer_statu as ucs')
->join('users', 'ucs.user_id', '=', 'users.id')
->select(
'ucs.customer_id',
'users.first_name',
'users.last_name',
DB::raw('ROW_NUMBER() OVER(PARTITION BY ucs.customer_id ORDER BY ucs.updated_at DESC) as rn')
)
->whereIn('ucs.customer_id', $customerIds);
$latestStatusDates = DB::table('user_customer_statu')
->select('customer_id', DB::raw('MAX(updated_at) as latest_update'))
->whereIn('customer_id', $customerIds)
->groupBy('customer_id');
$statusUsersMap = DB::table('user_customer_statu as ucs')
->joinSub($latestStatusDates, 'latest', function ($join) {
$join->on('ucs.customer_id', '=', 'latest.customer_id')
->on('ucs.updated_at', '=', 'latest.latest_update');
})
->join('users', 'ucs.user_id', '=', 'users.id')
->select('ucs.customer_id', 'users.first_name', 'users.last_name')
->get()
->groupBy('customer_id');
$getCustomerName = DB::table('user_customer_reservation')
->select('customer_id', 'reserve_id', 'start_date_reserve')
->whereNull('deleted_at')
->whereIn('customer_id', $customerIds)
->orderBy('start_date_reserve', 'desc')
->get();
$filteredData = $result->get()->map(function ($customer) use (
$reservationNames,
$customerReservationsMap,
$tempCustomerDataList,
$callCountsMap,
$callDetailsMap,
$statusUsersMap,
$getCustomerName,
) {
$tempCustomerData = $tempCustomerDataList->first(function ($item) use ($customer) {
return in_array((string) $customer->id, json_decode($item->customer_ids, true));
});
$customer->expiration_date = $tempCustomerData ? Carbon::parse($tempCustomerData->created_at)->addHours(48) : null;
$customer->total_calls = $callCountsMap[$customer->id]->total_calls ?? 0;
$customer->call_details = isset($callDetailsMap[$customer->id])
? $callDetailsMap[$customer->id]->map(function ($detail) {
return [
'first_name' => $detail->first_name ?? "Bilinmiyor",
'last_name' => $detail->last_name ?? "Bilinmiyor",
'user_call_count' => $detail->user_call_count ?? 0,
];
})->toArray()
: [];
$statusUsers = isset($statusUsersMap[$customer->id])
? $statusUsersMap[$customer->id]->map(function ($statusUser) {
return $statusUser->first_name . ' ' . $statusUser->last_name;
})->toArray()
: [];
$customer->status_users = implode(', ', $statusUsers);
$customerReservations = $customerReservationsMap[$customer->id] ?? collect([]);
$latestReservation = $customerReservations->first();
$reservationGetName = $getCustomerName->firstWhere('customer_id',$customer->id);
$customer->end_date = $reservationGetName && isset($reservationNames[$reservationGetName->reserve_id]) ? $reservationNames[$reservationGetName->reserve_id]->reservation_name : null;
if ($latestReservation && isset($reservationNames[$latestReservation->reserve_id])) {
$customer->reserve_name = $reservationNames[$latestReservation->reserve_id]->reservation_name;
} else {
$customer->reserve_name = null;
}
$customer->is_reserve_locked = ($customer->reserve_lock == 1);
if ($customer->is_reserve_locked && $latestReservation && $latestReservation->start_date_reserve) {
$customer->reserve_lock_date = Carbon::parse($latestReservation->start_date_reserve)
->addMonths(3)
->format('d-m-Y');
} else {
$customer->reserve_lock_date = null;
}
return $customer;
});
return response()->json([
'filterdata' => $filteredData,
]);
}