ikinci temizlik tamamlandı

This commit is contained in:
Ümit Tunç
2026-04-28 21:15:09 +03:00
parent f80443aec0
commit 37e7296527
8313 changed files with 2400677 additions and 0 deletions
@@ -0,0 +1,177 @@
<?php
// resources/views/admin-ajax/test-package/iso-base-interactive.blade.php
use App\Models\TestPackage;
use App\Models\TestPackBaseStatus;
header('Content-Type: application/json');
// Step 1: test_pack_base_statuses ve test_packages tablolarını join ederek veri çekelim
$query = db('test_pack_base_statuses')
->leftJoin('test_packages', function($join) {
$join->on('test_pack_base_statuses.test_package_no', '=', 'test_packages.test_package_number');
})
->select([
'test_pack_base_statuses.id',
'test_pack_base_statuses.drawing_no as iso_number',
'test_pack_base_statuses.test_package_no',
'test_pack_base_statuses.subcontractor',
'test_pack_base_statuses.responsible_person',
'test_pack_base_statuses.iso_qty',
'test_pack_base_statuses.priority',
'test_pack_base_statuses.priority_info',
'test_pack_base_statuses.target_test_date',
'test_pack_base_statuses.test_medium',
'test_pack_base_statuses.test_pressure_mpa',
'test_pack_base_statuses.tp_status',
'test_pack_base_statuses.total_iso_quantity',
'test_pack_base_statuses.welding_status',
'test_pack_base_statuses.remaining_wdi',
'test_pack_base_statuses.total_wdi',
'test_pack_base_statuses.total_complated_wdi',
'test_pack_base_statuses.pipe_progress',
'test_pack_base_statuses.total_joint_qty',
'test_pack_base_statuses.total_welded_joint_qty',
'test_pack_base_statuses.support_progress',
'test_pack_base_statuses.support_remaining',
'test_pack_base_statuses.welded_support_quantity',
'test_pack_base_statuses.repair_qty',
'test_pack_base_statuses.repair_completed',
'test_pack_base_statuses.repair_remaining',
'test_pack_base_statuses.punch_status',
'test_pack_base_statuses.punch_a_quantity',
'test_pack_base_statuses.punch_b_quantity',
'test_pack_base_statuses.punch_c_quantity',
'test_pack_base_statuses.vt_backlog',
'test_pack_base_statuses.rt_backlog',
'test_pack_base_statuses.ut_backlog',
'test_pack_base_statuses.mt_backlog',
'test_pack_base_statuses.pmi_backlog',
'test_pack_base_statuses.pt_backlog',
'test_pack_base_statuses.ferrit_backlog',
'test_pack_base_statuses.pwht_backlog',
'test_pack_base_statuses.area',
'test_pack_base_statuses.discipline',
'test_pack_base_statuses.test_type',
'test_packages.welding_progress',
'test_packages.test_date',
'test_packages.status',
'test_packages.reinstatement_status',
'test_packages.cleaning_blowing_drying_status'
]);
// Sıralama
$query->orderBy('area', 'ASC')
->orderBy('test_package_no', 'ASC')
->orderBy('drawing_no', 'ASC');
// Tüm veriyi getir
$data = $query->get();
// Test progress hesaplama - test_package_no bazında test_date dolu olanları say
$testPackageTestCounts = [];
$testPackageTotalCounts = [];
foreach ($data as $row) {
$testPackageNo = $row->test_package_no;
if (!isset($testPackageTotalCounts[$testPackageNo])) {
$testPackageTotalCounts[$testPackageNo] = 0;
$testPackageTestCounts[$testPackageNo] = 0;
}
$testPackageTotalCounts[$testPackageNo]++;
if (!empty($row->test_date)) {
$testPackageTestCounts[$testPackageNo]++;
}
}
// Hesaplanmış alanları ekle
foreach ($data as $row) {
// NULL değerleri 0 yap
$row->total_wdi = (float)($row->total_wdi ?? 0);
$row->total_complated_wdi = (float)($row->total_complated_wdi ?? 0);
$row->pipe_progress = (float)($row->pipe_progress ?? 0);
$row->support_progress = (float)($row->support_progress ?? 0);
$row->repair_qty = (int)($row->repair_qty ?? 0);
$row->repair_completed = (int)($row->repair_completed ?? 0);
// Completion oranları
$row->wdi_completion_percentage = $row->total_wdi > 0 ?
round(($row->total_complated_wdi / $row->total_wdi) * 100, 2) : 0;
$row->pipe_progress_percentage = round($row->pipe_progress, 2);
$row->support_progress_percentage = round($row->support_progress, 2);
// Repair completion oranı
$row->repair_completion_percentage = $row->repair_qty > 0 ?
round(($row->repair_completed / $row->repair_qty) * 100, 2) : 0;
// NDT toplam backlog
$row->total_ndt_backlog = (int)($row->vt_backlog ?? 0) + (int)($row->rt_backlog ?? 0) +
(int)($row->ut_backlog ?? 0) + (int)($row->mt_backlog ?? 0) +
(int)($row->pt_backlog ?? 0) + (int)($row->pmi_backlog ?? 0) +
(int)($row->ferrit_backlog ?? 0) + (int)($row->pwht_backlog ?? 0);
// Punch toplam
$row->total_punch_qty = (int)($row->punch_a_quantity ?? 0) + (int)($row->punch_b_quantity ?? 0) +
(int)($row->punch_c_quantity ?? 0);
// Welding completion oranı - basit hesaplama
$row->welding_completion_percentage = $row->wdi_completion_percentage;
$row->total_welds = 1; // dummy value
$row->completed_welds = $row->wdi_completion_percentage >= 100 ? 1 : 0;
// Weld Progress - welding_progress alanından veya hesaplanmış değerden
$row->weld_progress = $row->welding_progress ?? $row->wdi_completion_percentage;
// Test Progress - test_package_no bazında hesaplanmış değerleri ekle
$testPackageNo = $row->test_package_no;
$row->tested_count = $testPackageTestCounts[$testPackageNo] ?? 0;
$row->total_test_count = $testPackageTotalCounts[$testPackageNo] ?? 0;
$row->test_progress = $row->tested_count . '/' . $row->total_test_count;
// Status analizi
$row->overall_status = 'In Progress';
if ($row->tp_status == 'Completed' || $row->welding_status == 'Completed') {
$row->overall_status = 'Completed';
} elseif ($row->wdi_completion_percentage >= 100 && $row->total_ndt_backlog == 0) {
$row->overall_status = 'Ready for Test';
} elseif ($row->total_ndt_backlog > 0) {
$row->overall_status = 'NDT Pending';
} elseif ($row->total_punch_qty > 0) {
$row->overall_status = 'Punch List Open';
}
// General status mapping
$row->tp_general_status = $row->tp_status ?? $row->welding_status ?? 'Unknown';
// Renk kodlama için priority level
$row->priority_level = 'normal';
if (stripos($row->priority ?? '', 'high') !== false || stripos($row->priority ?? '', 'urgent') !== false) {
$row->priority_level = 'high';
} elseif (stripos($row->priority ?? '', 'low') !== false) {
$row->priority_level = 'low';
}
// Tarih formatları
$row->target_test_date_formatted = $row->target_test_date ?
date('d.m.Y', strtotime($row->target_test_date)) : '';
// Progress bar değerleri
$row->wdi_progress_color = $row->wdi_completion_percentage >= 90 ? 'success' :
($row->wdi_completion_percentage >= 70 ? 'warning' : 'danger');
$row->ndt_status_color = $row->total_ndt_backlog == 0 ? 'success' : 'danger';
}
// Laravel Collection'ı array'e çevir ve JSON response
$dataArray = $data->map(function($item) {
return (array) $item;
})->toArray();
// Veri kontrolü - eğer boşsa boş array döndür
if (empty($dataArray)) {
echo json_encode_tr([]);
exit;
}
// DevExtreme DataGrid için JSON response - json_encode_tr kullan (Türkçe karakter desteği için)
echo json_encode_tr($dataArray);
@@ -0,0 +1,131 @@
<?php
use App\Models\TestPackBaseStatus;
use App\Services\Dashboards\TestPackageDashboardService;
header('Content-Type: application/json');
try {
$chartType = $_GET['chart'] ?? null;
$year = (int) ($_GET['year'] ?? date('Y'));
if (in_array($chartType, ['monthly', 'pie', 'subcontractor', 'summary'], true)) {
$trends = TestPackageDashboardService::monthlyTrends($year);
switch ($chartType) {
case 'monthly':
echo json_encode_tr($trends['monthly']);
break;
case 'pie':
echo json_encode_tr([
'pie' => $trends['pie'],
'summary' => $trends['summary']
]);
break;
case 'subcontractor':
echo json_encode_tr($trends['subcontractor']);
break;
case 'summary':
echo json_encode_tr($trends['summary']);
break;
}
return;
}
// Area bazında Subcontractor grafiği
if ($chartType === 'area-subcontractor') {
$data = db('test_pack_base_statuses')
->select('area', 'subcontractor')
->selectRaw('COUNT(*) as total_packages')
->whereNotNull('area')
->where('area', '!=', '')
->whereNotNull('subcontractor')
->where('subcontractor', '!=', '')
->groupBy('area', 'subcontractor')
->orderBy('area')
->orderBy('subcontractor')
->get();
echo json_encode_tr($data);
return;
}
if ($chartType === 'ndt') {
// NDT Backlog by Discipline
$data = db('test_pack_base_statuses')
->select('discipline')
->selectRaw('SUM(COALESCE(rt_backlog, 0)) as rt_backlog')
->selectRaw('SUM(COALESCE(ut_backlog, 0)) as ut_backlog')
->selectRaw('SUM(COALESCE(mt_backlog, 0)) as mt_backlog')
->selectRaw('SUM(COALESCE(pt_backlog, 0)) as pt_backlog')
->selectRaw('SUM(COALESCE(vt_backlog, 0)) as vt_backlog')
->selectRaw('SUM(COALESCE(pmi_backlog, 0)) as pmi_backlog')
->selectRaw('SUM(COALESCE(ferrit_backlog, 0)) as ferrit_backlog')
->selectRaw('SUM(COALESCE(pwht_backlog, 0)) as pwht_backlog')
->whereNotNull('discipline')
->where('discipline', '!=', '')
->groupBy('discipline')
->get();
// Veri yoksa boş array döndür
if (!$data || $data->isEmpty()) {
echo json_encode_tr([]);
} else {
// Sayısal değerleri float'a çevir
$formattedData = $data->map(function($item) {
return [
'discipline' => $item->discipline,
'rt_backlog' => (float) $item->rt_backlog,
'ut_backlog' => (float) $item->ut_backlog,
'mt_backlog' => (float) $item->mt_backlog,
'pt_backlog' => (float) $item->pt_backlog,
'vt_backlog' => (float) $item->vt_backlog,
'pmi_backlog' => (float) $item->pmi_backlog,
'ferrit_backlog' => (float) $item->ferrit_backlog,
'pwht_backlog' => (float) $item->pwht_backlog
];
});
echo json_encode_tr($formattedData);
}
} elseif ($chartType === 'progress') {
// Progress Analysis by Discipline
$data = db('test_pack_base_statuses')
->select('discipline')
->selectRaw('AVG(COALESCE(pipe_progress, 0)) as pipe_progress')
->selectRaw('AVG(COALESCE(support_progress, 0)) as support_progress')
->selectRaw('SUM(COALESCE(remaining_wdi, 0)) as remaining_wdi')
->whereNotNull('discipline')
->where('discipline', '!=', '')
->groupBy('discipline')
->get();
// Veri yoksa boş array döndür
if (!$data || $data->isEmpty()) {
echo json_encode_tr([]);
} else {
// Sayısal değerleri float'a çevir
$formattedData = $data->map(function($item) {
return [
'discipline' => $item->discipline,
'pipe_progress' => (float) $item->pipe_progress,
'support_progress' => (float) $item->support_progress,
'remaining_wdi' => (float) $item->remaining_wdi
];
});
echo json_encode_tr($formattedData);
}
} else {
// Default: Tüm veriler (PivotGrid için)
$testPackages = TestPackBaseStatus::get();
echo json_encode_tr($testPackages);
}
} catch (\Exception $e) {
http_response_code(500);
echo json_encode([
'error' => true,
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
?>
@@ -0,0 +1,19 @@
<?php
use App\Services\Dashboards\TestPackageDashboardService;
header('Content-Type: application/json');
try {
$payload = TestPackageDashboardService::statusPivotDataset();
echo json_encode_tr($payload);
} catch (\Throwable $th) {
http_response_code(500);
echo json_encode_tr([
'error' => true,
'message' => $th->getMessage(),
'file' => $th->getFile(),
'line' => $th->getLine(),
]);
}
@@ -0,0 +1,197 @@
<?php
// resources/views/admin-ajax/test-package/summary-by-test-type.blade.php
use App\Models\TestPackage;
header('Content-Type: application/json');
try {
// Step 1: weld_logs tablosundan test_package_no -> project mapping'i oluştur
$testPackageAreaMap = [];
$weldLogAreas = db('weld_logs')
->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;
}
// Responsible person map (test_pack_base_statuses)
$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;
}
}
// Step 2: Test packages verilerini tek sorguda çek
$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();
// Step 3: Area, Test Type ve Subcontractor bazlı analiz için boş diziler oluştur
$areaTestTypeStats = [];
// Step 4: Test packages verilerini işle
if (empty($allTestPackages) || $allTestPackages->isEmpty()) {
echo json_encode_tr([]);
exit;
}
foreach ($allTestPackages as $testPackage) {
// Normalize values (trim and lowercase for case-insensitive comparison)
$areaRaw = trim($testPackageAreaMap[$testPackage->test_package_number] ?? 'Unknown');
$testTypeRaw = trim($testPackage->test_type ?: 'Unknown');
$subcontractorRaw = trim(!empty($testPackage->subcontractor) ? $testPackage->subcontractor : 'Unassigned');
$responsiblePersonRaw = trim($testPackageResponsiblePersonMap[$testPackage->test_package_number] ?? 'Unassigned');
// Create normalized display values (ucwords for title case - each word capitalized)
$area = ($areaRaw === 'Unknown' || $areaRaw === '') ? 'Unknown' : ucwords(strtolower($areaRaw));
$testType = ($testTypeRaw === 'Unknown' || $testTypeRaw === '') ? 'Unknown' : ucwords(strtolower($testTypeRaw));
$subcontractor = ($subcontractorRaw === 'Unassigned' || $subcontractorRaw === '') ? 'Unassigned' : ucwords(strtolower($subcontractorRaw));
$responsiblePerson = ($responsiblePersonRaw === 'Unassigned' || $responsiblePersonRaw === '') ? 'Unassigned' : ucwords(strtolower($responsiblePersonRaw));
// Create case-insensitive key for merging (lowercase)
$key = strtolower(implode('|', [$areaRaw, $testTypeRaw, $subcontractorRaw, $responsiblePersonRaw]));
if (!isset($areaTestTypeStats[$key])) {
$areaTestTypeStats[$key] = [
'area' => $area,
'test_type' => $testType,
'subcontractor' => $subcontractor,
'responsible_person' => $responsiblePerson,
'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 =& $areaTestTypeStats[$key];
$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;
}
}
$data = array_map(function($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);
$stats['sort_index'] = 0;
$stats['is_total_row'] = false;
$stats['responsible_person'] = $stats['responsible_person'] ?? 'Unassigned';
return $stats;
}, array_values($areaTestTypeStats));
// Grand Total satırları kaldırıldı - task'ta böyle bir istek yok
// Veri kontrolü - her zaman array döndür
echo json_encode_tr($data);
} catch (\Exception $e) {
http_response_code(500);
echo json_encode([
'error' => true,
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine()
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
}
@@ -0,0 +1,146 @@
<?php
use App\Models\PunchList;
use App\Models\TestPackage;
use App\Services\Dashboards\TestPackageDashboardService;
use Illuminate\Support\Facades\DB;
$projectMap = TestPackageDashboardService::projectMap();
$punchStats = PunchList::select('test_package', 'category', 'status', DB::raw('COUNT(*) as qty'))
->groupBy('test_package', 'category', 'status')
->get();
$punchMap = [];
foreach ($punchStats as $stat) {
$testPackageNo = $stat->test_package ?? '';
if ($testPackageNo === '') {
continue;
}
$category = strtoupper($stat->category ?? '');
if (!in_array($category, ['A', 'B', 'C'])) {
continue;
}
$status = strtolower($stat->status ?? '');
$qty = (int) $stat->qty;
if (!isset($punchMap[$testPackageNo][$category])) {
$punchMap[$testPackageNo][$category] = [
'open' => 0,
'closed' => 0,
'cancel' => 0,
];
}
if ($status === 'closed') {
$punchMap[$testPackageNo][$category]['closed'] += $qty;
} elseif ($status === 'cancel' || $status === 'canceled') {
$punchMap[$testPackageNo][$category]['cancel'] += $qty;
} else {
$punchMap[$testPackageNo][$category]['open'] += $qty;
}
}
$testPackages = TestPackage::select(
'test_package_number',
'unit',
'subcontractor',
'test_type',
'ndt_status',
'tp_general_status',
'test_status',
'a_punch_point_open',
'b_punch_point_open',
'c_punch_point_open'
)->get();
$rows = [];
$categories = ['A', 'B', 'C'];
foreach ($testPackages as $testPackage) {
$tpNumber = $testPackage->test_package_number;
if (!$tpNumber) {
continue;
}
// Normalize values (trim for case-insensitive comparison)
$projectRaw = trim($projectMap[$tpNumber] ?? 'Unknown');
$locationRaw = trim($testPackage->unit ?: 'Unknown');
$subcontractorRaw = trim($testPackage->subcontractor ?: 'Unassigned');
$testTypeRaw = trim($testPackage->test_type ?: 'Unknown');
// Create normalized display values (ucwords for title case - each word capitalized)
$project = ($projectRaw === 'Unknown' || $projectRaw === '') ? 'Unknown' : ucwords(strtolower($projectRaw));
$location = ($locationRaw === 'Unknown' || $locationRaw === '') ? 'Unknown' : ucwords(strtolower($locationRaw));
$subcontractor = ($subcontractorRaw === 'Unassigned' || $subcontractorRaw === '') ? 'Unassigned' : ucwords(strtolower($subcontractorRaw));
$testType = ($testTypeRaw === 'Unknown' || $testTypeRaw === '') ? 'Unknown' : ucwords(strtolower($testTypeRaw));
// Create case-insensitive key for merging (lowercase)
$key = strtolower(implode('|', [$projectRaw, $locationRaw, $subcontractorRaw, $testTypeRaw]));
if (!isset($rows[$key])) {
$rows[$key] = [
'project' => $project,
'location' => $location,
'subcontractor' => $subcontractor,
'test_type' => $testType,
'tp_general_status' => $testPackage->tp_general_status ?? '',
'total_packages' => 0,
'tested' => 0,
'not_tested' => 0,
'ready_for_test' => 0,
'accepted' => 0,
'rejected' => 0,
'a_accepted' => 0,
'a_not_tested' => 0,
'a_rejected' => 0,
'b_accepted' => 0,
'b_not_tested' => 0,
'b_rejected' => 0,
'c_accepted' => 0,
'c_not_tested' => 0,
'c_rejected' => 0,
];
}
$rows[$key]['total_packages']++;
$testStatus = strtolower($testPackage->test_status ?? '');
$generalStatus = strtolower($testPackage->tp_general_status ?? '');
$ndtStatus = strtolower($testPackage->ndt_status ?? '');
if ($testStatus === 'accepted' || $generalStatus === 'completed') {
$rows[$key]['tested']++;
} else {
$rows[$key]['not_tested']++;
}
if (in_array($generalStatus, ['ready for test', 'ready for reinstatement', 'completed'])) {
$rows[$key]['ready_for_test']++;
}
if ($ndtStatus === 'accepted') {
$rows[$key]['accepted']++;
} else {
$rows[$key]['rejected']++;
}
foreach ($categories as $category) {
$categoryKey = strtolower($category);
$stats = $punchMap[$tpNumber][$category] ?? null;
if ($stats) {
$rows[$key]["{$categoryKey}_accepted"] += $stats['closed'];
$rows[$key]["{$categoryKey}_not_tested"] += $stats['cancel'];
$rows[$key]["{$categoryKey}_rejected"] += $stats['open'];
} else {
$fallback = (int) $testPackage->{$categoryKey . '_punch_point_open'};
$rows[$key]["{$categoryKey}_rejected"] += $fallback;
}
}
}
echo json_encode_tr(array_values($rows));
@@ -0,0 +1,216 @@
<?php
// resources/views/admin-ajax/test-package/summary2.blade.php
use App\Models\TestPackage;
header('Content-Type: application/json');
$testPackageAreaMap = [];
$weldLogAreas = db('weld_logs')
->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);