Files
2026-04-28 21:15:09 +03:00

146 lines
4.7 KiB
PHP

<?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));