$table) { // Burada her bir test türü için rapor dosyası yükleme durumunu kontrol et // Memory optimization: Count instead of fetching all data $uploadedCount = DB::table($table)->whereNotNull('report_file')->count(); $notUploadedCount = DB::table($table)->whereNull('report_file')->count(); $totalCount = DB::table($table)->count(); // Only fetch necessary fields for calculations - optimize query $reportFiles = DB::table($table) ->select("{$key}_result", "{$key}_request_no", "{$key}_request_date", "test_laboratory_{$key}", "report_file") ->whereNotNull("{$key}_request_date") ->get(); // NDT türleri için veri hazırlama $resultField = "{$key}_result"; if ($key === 'pmi') { $reportField = 'no_of_testing_report'; } elseif ($key === 'pwht') { $reportField = 'no_of_pwht_report'; } else { $reportField = "{$key}_report"; } $requestedField = "{$key}_request_no"; $requestedCount = count(array_filter($reportFiles->toArray(), fn($file) => $file->{$requestedField} !== null)); // İstenen NDT sayısı $receivedResultCount = count(array_filter($reportFiles->toArray(), fn($file) => $file->{$resultField} !== null)); // Alınan sonuç sayısı $receivedReportCount = count(array_filter($reportFiles->toArray(), fn($file) => $file->report_file !== null)); // Alınan rapor sayısı // Bekleyen rapor sayısını hesapla $waitingReportsCount = $receivedResultCount - $receivedReportCount; // Aylık verileri hazırlama $monthlyDataLab = []; // Laboratuvar bazında veri $monthlyDataTestType = []; // Test türü bazında veri foreach ($reportFiles as $file) { if(rejected_date($file->{$key . '_request_date'})) { continue; } $month = date('M.Y', strtotime($file->{$key . '_request_date'})); // Aylık format $labKey = $file->{"test_laboratory_{$key}"}; // Laboratuvar anahtarı $upperKey = strtoupper($key); // Laboratuvar bazında veri - requested/received mantığı if (!isset($monthlyDataLab[$month][$upperKey][$labKey])) { $monthlyDataLab[$month][$upperKey][$labKey] = [ 'requested' => 0, 'received' => 0, ]; } // Requested: request_no dolu olanlar if ($file->{$requestedField} != '' && $file->{$requestedField} !== null) { $monthlyDataLab[$month][$upperKey][$labKey]['requested']++; // Received: result dolu olanlar (requested olanlar içinden) if ($file->{$resultField} != '' && $file->{$resultField} !== null) { $monthlyDataLab[$month][$upperKey][$labKey]['received']++; } } // Test türü bazında veri - requested/received mantığı if (!isset($monthlyDataTestType[$month][$upperKey])) { $monthlyDataTestType[$month][$upperKey] = [ 'requested' => 0, 'received' => 0, ]; } // Requested: request_no dolu olanlar if ($file->{$requestedField} != '' && $file->{$requestedField} !== null) { $monthlyDataTestType[$month][$upperKey]['requested']++; // Received: result dolu olanlar (requested olanlar içinden) if ($file->{$resultField} != '' && $file->{$resultField} !== null) { $monthlyDataTestType[$month][$upperKey]['received']++; } } } // Aylık verileri dxChart için uygun formatta hazırlama - requested/received foreach ($monthlyDataLab as $month => $counts) { foreach ($counts as $lab => $data) { foreach ($data as $upperKey => $data) { $ndtChartDataLab[] = [ 'month' => $month, 'test_type' => $lab, 'laboratory' => $upperKey, 'requested' => $data['requested'], 'received' => $data['received'], ]; } } } foreach ($monthlyDataTestType as $month => $counts) { foreach ($counts as $testType => $data) { // Her bir test tipi için ayrı bir dizi oluştur - requested/received $ndtChartDataTestType[] = [ 'month' => $month, 'test_type' => $testType, 'requested' => $data['requested'], 'received' => $data['received'], ]; } } // Aylık verileri tarihe göre sıralama usort($ndtChartDataTestType, function($a, $b) { return strtotime($a['month']) - strtotime($b['month']); }); // Aylık verileri tarihe göre sıralama usort($ndtChartDataLab, function($a, $b) { return strtotime($a['month']) - strtotime($b['month']); }); // dxDataGrid için uygun formatta veri hazırlama $ndtDataForGrid[] = [ 'test_type' => strtoupper($key), 'responsible' => @$reportFiles[0]?->{"test_laboratory_{$key}"}, // Buraya ilgili taşeron firma bilgisi eklenmeli 'requested' => $totalCount, 'received_result' => $receivedResultCount, 'received_reports' => $receivedReportCount, 'waiting_reports' => $waitingReportsCount, ]; $uploadedReportData[$key] = [ 'uploaded' => $uploadedCount, 'not_uploaded' => $notUploadedCount, ]; } // Yükleme durumunun toplam sayıya oranı için veri hazırlama $uploadRatioData = []; foreach ($uploadedReportData as $key => $counts) { $totalReports = $counts['uploaded'] + $counts['not_uploaded']; $uploadRatioData[$key] = $totalReports > 0 ? ($counts['uploaded'] * 100 / $totalReports) : 0; // Oranı hesapla } // Her bir test tipi için ayrı seriler oluşturma $testTypeSeries = []; foreach ($ndtChartDataTestType as $entry) { $testTypeSeries[$entry['test_type']][] = $entry; } // Her bir test tipi için ayrı seriler oluşturma $labSeries = []; foreach ($ndtChartDataLab as $entry) { $entry['laboratory'] = trim($entry['laboratory']); $entry['laboratory'] = $entry['laboratory'] == "" ? "Empty" : $entry['laboratory']; $labSeries[$entry['laboratory']][$entry['test_type']][] = $entry; } // JSON çıktısı oluşturma $response = [ 'uploadReportData' => $uploadedReportData, 'uploadRatioData' => $uploadRatioData, 'ndtData' => $ndtDataForGrid, // NDT verilerini dxDataGrid için güncelledik 'ndtChartDataLab' => $ndtChartDataLab, // Laboratuvar bazında aylık veri 'ndtChartDataTestType' => $ndtChartDataTestType, // Test türü bazında aylık veri 'testTypeSeries' => $testTypeSeries, 'labSeries' => $labSeries, 'cached_at' => now()->format('Y-m-d H:i:s'), ]; // Cache the response for faster subsequent loads Cache::put($cacheKey, $response, now()->addMinutes($cacheDuration)); echo json_encode_tr($response); ?>