select('test_package_no', 'project') ->whereNotNull('test_package_no') ->whereNotNull('project') ->where('test_package_no', '!=', '') ->where('project', '!=', '') ->groupBy('test_package_no', 'project') ->get(); foreach ($weldLogAreas as $weldLog) { $testPackageAreaMap[$weldLog->test_package_no] = $weldLog->project; } // test_pack_base_statuses tablosundan responsible_person mapping'i oluştur $testPackageResponsiblePersonMap = []; $baseStatuses = db('test_pack_base_statuses') ->select('test_package_no', 'responsible_person') ->whereNotNull('test_package_no') ->where('test_package_no', '!=', '') ->get(); foreach ($baseStatuses as $baseStatus) { if (!empty($baseStatus->responsible_person)) { $testPackageResponsiblePersonMap[$baseStatus->test_package_no] = $baseStatus->responsible_person; } } $allTestPackages = TestPackage::select( 'test_package_number', 'test_type', 'tp_general_status', 'welding_status', 'status', 'ndt_status', 'punch_status', 'total_wdi', 'a_punch_point_open', 'b_punch_point_open', 'c_punch_point_open', 'subcontractor' )->whereNotNull('test_package_number') ->where('test_package_number', '!=', '') ->get(); // Area, Subcontractor ve Responsible Person bazlı 3 seviyeli array yapısı $areaStats = []; foreach ($allTestPackages as $testPackage) { $area = $testPackageAreaMap[$testPackage->test_package_number] ?? 'Unknown'; $subcontractor = !empty($testPackage->subcontractor) ? $testPackage->subcontractor : 'Unassigned'; // responsible_person bilgisini test_pack_base_statuses tablosundan al $responsiblePerson = $testPackageResponsiblePersonMap[$testPackage->test_package_number] ?? 'Unassigned'; $testType = !empty($testPackage->test_type) ? $testPackage->test_type : 'Unknown'; if (!isset($areaStats[$area])) { $areaStats[$area] = []; } if (!isset($areaStats[$area][$subcontractor])) { $areaStats[$area][$subcontractor] = []; } if (!isset($areaStats[$area][$subcontractor][$responsiblePerson])) { $areaStats[$area][$subcontractor][$responsiblePerson] = [ 'area' => $area, 'subcontractor' => $subcontractor, 'responsible_person' => $responsiblePerson, 'test_types' => [], 'total_tp_qty' => 0, 'total_tp_wdi' => 0, 'prep_qty' => 0, 'prep_wdi' => 0, 'approved_qty' => 0, 'approved_wdi' => 0, 'linecheck_qty' => 0, 'a_punch_qty' => 0, 'b_punch_qty' => 0, 'c_punch_qty' => 0, 'linecheck_wdi' => 0, 'tp_released_qty' => 0, 'tp_released_wdi' => 0, 'b_waiting_qty' => 0, 'ndt_status_qty' => 0, 'punch_status_qty' => 0, 'ready_for_reinstatement_qty' => 0, 'ready_for_test_qty' => 0, 'repair_waiting_qty' => 0, 'welding_ongoing_qty' => 0, 'completed_qty' => 0, ]; } $row =& $areaStats[$area][$subcontractor][$responsiblePerson]; // Test type'ı array'e ekle (unique olacak şekilde) if (!empty($testType) && !in_array($testType, $row['test_types'])) { $row['test_types'][] = $testType; } $wdi = (float) $testPackage->total_wdi; $wdi = round((float) $testPackage->total_wdi, 2); $row['total_tp_qty']++; $row['total_tp_wdi'] += $wdi; if (!empty($testPackage->welding_status) && stripos($testPackage->welding_status, 'prep') !== false) { $row['prep_qty']++; $row['prep_wdi'] += $wdi; } if (!empty($testPackage->status) && stripos($testPackage->status, 'released') !== false) { $row['tp_released_qty']++; $row['tp_released_wdi'] += $wdi; } if (!empty($testPackage->punch_status)) { $row['linecheck_qty']++; $row['linecheck_wdi'] += $wdi; } $row['a_punch_qty'] += (int) $testPackage->a_punch_point_open; $row['b_punch_qty'] += (int) $testPackage->b_punch_point_open; $row['c_punch_qty'] += (int) $testPackage->c_punch_point_open; switch ($testPackage->tp_general_status) { case 'B Waiting': $row['b_waiting_qty']++; break; case 'NDT': $row['ndt_status_qty']++; break; case 'Punch': $row['punch_status_qty']++; break; case 'Ready for Reinstatement': $row['ready_for_reinstatement_qty']++; break; case 'Ready for Test': $row['ready_for_test_qty']++; break; case 'Repair Waiting': $row['repair_waiting_qty']++; break; case 'Welding Ongoing': $row['welding_ongoing_qty']++; break; case 'Completed': $row['completed_qty']++; break; } if ( (!empty($testPackage->tp_general_status) && stripos($testPackage->tp_general_status, 'approved') !== false) || (!empty($testPackage->status) && stripos($testPackage->status, 'approved') !== false) ) { $row['approved_qty']++; $row['approved_wdi'] += $wdi; } } // 3 seviyeli array'i düzleştir $data = []; foreach ($areaStats as $subcontractors) { foreach ($subcontractors as $responsiblePersons) { if (is_array($responsiblePersons)) { foreach ($responsiblePersons as $stats) { $stats['total_tp_wdi'] = round($stats['total_tp_wdi'], 2); $stats['prep_wdi'] = round($stats['prep_wdi'], 2); $stats['approved_wdi'] = round($stats['approved_wdi'], 2); $stats['linecheck_wdi'] = round($stats['linecheck_wdi'], 2); $stats['tp_released_wdi'] = round($stats['tp_released_wdi'], 2); // Test type'ları virgülle ayırarak birleştir $stats['test_type'] = !empty($stats['test_types']) ? implode(', ', $stats['test_types']) : 'Unknown'; unset($stats['test_types']); // Array'i kaldır $data[] = $stats; } } } } // Grand total hesapla $numericKeys = [ 'total_tp_qty', 'total_tp_wdi', 'prep_qty', 'prep_wdi', 'approved_qty', 'approved_wdi', 'linecheck_qty', 'linecheck_wdi', 'a_punch_qty', 'b_punch_qty', 'c_punch_qty', 'tp_released_qty', 'tp_released_wdi', 'b_waiting_qty', 'ndt_status_qty', 'punch_status_qty', 'ready_for_reinstatement_qty', 'ready_for_test_qty', 'repair_waiting_qty', 'welding_ongoing_qty', 'completed_qty' ]; $grand = [ 'area' => 'Grand Total', 'subcontractor' => 'All Subcontractors', 'responsible_person' => 'All Responsible Persons', 'test_type' => 'All Test Types', ]; foreach ($numericKeys as $key) { $grand[$key] = array_sum(array_column($data, $key)); } $grand['total_tp_wdi'] = round($grand['total_tp_wdi'], 2); $grand['prep_wdi'] = round($grand['prep_wdi'], 2); $grand['approved_wdi'] = round($grand['approved_wdi'], 2); $grand['linecheck_wdi'] = round($grand['linecheck_wdi'], 2); $grand['tp_released_wdi'] = round($grand['tp_released_wdi'], 2); $data[] = $grand; echo json_encode_tr($data);