Files
citrus-cms/resources/views/admin-ajax/welder-performance.blade.php
2026-04-28 21:15:09 +03:00

197 lines
6.9 KiB
PHP

<?php
/**
* @api-readonly
* Returns welder performance statistics
*/
$welderLocations = welder_locations();
$query = apply_welded_filter(db("weld_logs"));
$query = $query
->select(
"mechanic_supervisor", "welder_1", "ste_subcontractor",
DB::raw('MONTH(welding_date) as month'), DB::raw('YEAR(welding_date) as year'), DB::raw('COUNT(*) as count'))
->selectRaw('ROUND(SUM(CASE WHEN no_of_the_joint_as_per_as_built_survey NOT LIKE "%R%" THEN nps_1 ELSE 0 END), 2) as welder_wdi_1')
->selectRaw('ROUND(SUM(CASE WHEN no_of_the_joint_as_per_as_built_survey LIKE "%R%" THEN nps_1 ELSE 0 END), 2) as repair_total_1')
->selectRaw('ROUND(SUM(CASE WHEN no_of_the_joint_as_per_as_built_survey LIKE "%R%" THEN nps_1 ELSE 0 END) * 100 / SUM(CASE WHEN no_of_the_joint_as_per_as_built_survey NOT LIKE "%R%" THEN nps_1 ELSE 0 END), 2) AS repair_rate_1')
->whereNotNull("welder_1")
->where("welder_1", "<>", "")
->whereRaw("YEAR(welding_date) = {$_GET['year']}")
->orderBy("welding_date", "ASC")
->groupBy(DB::raw('MONTH(welding_date)'), DB::raw('YEAR(welding_date)'))
->groupBy("welder_1");
$query = $query->get();
$crewQuery = apply_welded_filter(db("weld_logs"));
$crewQuery = $crewQuery
->select(
"mechanic_supervisor",
"ste_subcontractor",
"mechanic_supervisor_control_date",
DB::raw('COUNT(*) as total'),
DB::raw('MONTH(welding_date) as month'),
DB::raw('YEAR(welding_date) as year')
)
->whereNotNull("mechanic_supervisor")
->groupBy("mechanic_supervisor", DB::raw('MONTH(welding_date)'), DB::raw('YEAR(welding_date)'))
;
$crewQuery = $crewQuery->get();
$zoneQuery = apply_welded_filter(db("weld_logs"))
->select([
"project",
DB::raw('MAX(design_area) as design_area'),
DB::raw('ROUND(SUM(nps_1), 2) as total'),
DB::raw('SUM(CASE WHEN type_of_joint = "S" AND welding_date IS NOT NULL THEN nps_1 ELSE 0 END) AS welded_shop_wdi'),
DB::raw('SUM(CASE WHEN type_of_joint = "F" AND welding_date IS NOT NULL THEN nps_1 ELSE 0 END) AS welded_field_wdi'),
DB::raw('SUM(CASE WHEN type_of_joint = "S" AND welding_date IS NOT NULL THEN 1 ELSE 0 END) AS welded_shop_count'),
DB::raw('SUM(CASE WHEN type_of_joint = "F" AND welding_date IS NOT NULL THEN 1 ELSE 0 END) AS welded_field_count'),
DB::raw('SUM(CASE WHEN type_of_joint = "S" AND welding_date IS NULL THEN nps_1 ELSE 0 END) AS backlog_shop_wdi'),
DB::raw('SUM(CASE WHEN type_of_joint = "F" AND welding_date IS NULL THEN nps_1 ELSE 0 END) AS backlog_field_wdi'),
DB::raw('SUM(CASE WHEN type_of_joint = "S" AND welding_date IS NULL THEN 1 ELSE 0 END) AS backlog_shop_count'),
DB::raw('SUM(CASE WHEN type_of_joint = "F" AND welding_date IS NULL THEN 1 ELSE 0 END) AS backlog_field_count'),
DB::raw('ROUND(SUM(CASE WHEN welding_date IS NOT NULL THEN nps_1 ELSE 0 END) * 100 / SUM(nps_1), 2) AS proses_wdi')
])
->groupBy("project")
->get();
$refactor = [];
$crew = [];
foreach($crewQuery AS $q)
{
if(!isset($crew[$q->ste_subcontractor][$q->mechanic_supervisor][$q->month]))
$crew[$q->ste_subcontractor][$q->mechanic_supervisor][$q->month] = 0;
$crew[$q->ste_subcontractor][$q->mechanic_supervisor][$q->month] += $q->total;
}
foreach($query AS $q) {
$row = [];
for($k = 1; $k<=12; $k++) {
if(!isset($refactor[$q->welder_1]['welder_wdi_' . $k]))
{
$refactor[$q->welder_1]['welder_wdi_' . $k] = 0;
$refactor[$q->welder_1]['welder_wdi_' . $k . '_repair_total'] = 0;
$refactor[$q->welder_1]['welder_repair_' . $k] = 0;
$refactor[$q->welder_1]['welder_wdi_' . $k . '_change'] = "equal";
}
}
$refactor[$q->welder_1]['welder_wdi_' . $q->month] = $q->welder_wdi_1;
$refactor[$q->welder_1]['welder_wdi_' . $q->month . '_repair_total'] = $q->repair_total_1;
$refactor[$q->welder_1]['welder_repair_' . $q->month] = $q->repair_rate_1;
$refactor[$q->welder_1]['subcontractor'] = $q->ste_subcontractor;
$refactor[$q->welder_1]['welder'] = $q->welder_1;
}
$previousRepairRate = 0;
$data = $refactor;
$rows = [];
$added = [];
function calculateAverage($welderData) {
$sum = 0;
$count = 0;
for ($i = 1; $i <= 12; $i++) {
$key = 'welder_wdi_' . $i;
$value = $welderData[$key] ?? 0;
if($value > 0) {
$sum += $value;
$count++;
}
}
return $count > 0 ? round($sum / $count, 2) : 0;
}
foreach($refactor AS $welder => &$data) {
$refactor[$welder]['location'] = @$welderLocations[$welder];
$refactor[$welder]['avg'] = calculateAverage($refactor[$welder]);
// Calculate year_total_wdi from monthly sums
$yearTotal = 0;
for($i = 1; $i <= 12; $i++) {
$yearTotal += isset($refactor[$welder]['welder_wdi_' . $i]) ? $refactor[$welder]['welder_wdi_' . $i] : 0;
}
$refactor[$welder]['year_total_wdi'] = round($yearTotal, 2);
// Calculate change indicators for each month
for($month = 1; $month <= 12; $month++) {
$currentWDI = $refactor[$welder]['welder_wdi_' . $month] ?? 0;
$previousWDI = $refactor[$welder]['welder_wdi_' . ($month - 1)] ?? 0;
// WDI change indicator (for W column)
if($previousWDI < $currentWDI) {
$wdiChange = "up";
} elseif($previousWDI > $currentWDI) {
$wdiChange = "down";
} else {
$wdiChange = "equal";
}
$refactor[$welder]['welder_wdi_' . $month . '_change'] = $wdiChange;
// Repair rate change indicator (for RR column)
$currentRR = $refactor[$welder]['welder_repair_' . $month] ?? 0;
$previousRR = $refactor[$welder]['welder_repair_' . ($month - 1)] ?? 0;
if($previousRR < $currentRR) {
$rrChange = "up"; // Repair increased (bad)
} elseif($previousRR > $currentRR) {
$rrChange = "down"; // Repair decreased (good)
} else {
$rrChange = "equal";
}
$refactor[$welder]['welder_repair_' . $month . '_change'] = $rrChange;
}
if(!in_array($welder, $added)) {
$rows[] = $refactor[$welder];
$added[] = $welder;
}
}
$crewPerformance = [];
foreach($crew AS $subcontractor => $data) {
$row['subcontractor'] = $subcontractor;
foreach($data AS $supervizor => $monthData) {
$row['supervizor'] = $supervizor;
foreach($monthData AS $monthName => $value) {
$row["month_$monthName"] = $value;
}
}
$crewPerformance[] = $row;
}
$data = [
'welderPerformance' => $rows,
'crewPerformance' => $crewQuery,
'zonePerformance' => $zoneQuery
];
echo json_encode_tr($data);
?>