fixing data double

This commit is contained in:
JokoPrasetio 2026-05-18 16:49:01 +07:00
parent d98df34f2c
commit 834dd8c0c4

View File

@ -133,169 +133,169 @@ Route::get('/pitstop/progress-detail-external-ghost', [PitStopController::class,
// 'data' => $data // 'data' => $data
// ]; // ];
// }); // });
Route::get('/outsorching', function(){ // Route::get('/outsorching', function(){
$data = DB::connection('pgsql')->select(" // $data = DB::connection('pgsql')->select("
-- ========================= // -- =========================
-- 🔥 1. MATCH (FUZZY) // -- 🔥 1. MATCH (FUZZY)
-- ========================= // -- =========================
SELECT // SELECT
COALESCE(pl.nama, '-') AS nama_external, // COALESCE(pl.nama, '-') AS nama_external,
pl.tipe, // pl.tipe,
pg.id as pegawai_id, // pg.id as pegawai_id,
pg.namalengkap AS nama_internal, // pg.namalengkap AS nama_internal,
ukp.name AS unit, // ukp.name AS unit,
ROUND(similarity(LOWER(pl.nama), LOWER(pg.namalengkap))::numeric, 2) as score, // ROUND(similarity(LOWER(pl.nama), LOWER(pg.namalengkap))::numeric, 2) as score,
true as is_match, // true as is_match,
'MATCH' as status_data, // 'MATCH' as status_data,
COUNT(pr.id) as total_praakre, // COUNT(pr.id) as total_praakre,
COUNT(*) FILTER (WHERE pr.status = 'LULUS') as jumlah_lulus, // COUNT(*) FILTER (WHERE pr.status = 'LULUS') as jumlah_lulus,
COUNT(*) FILTER (WHERE pr.status = 'TIDAK LULUS') as jumlah_tidak_lulus, // COUNT(*) FILTER (WHERE pr.status = 'TIDAK LULUS') as jumlah_tidak_lulus,
COALESCE( // COALESCE(
json_agg( // json_agg(
json_build_object( // json_build_object(
'id', pr.id, // 'id', pr.id,
'unit_id', pr.unit_id, // 'unit_id', pr.unit_id,
'masterpitstop_id', pr.masterpitstop_id, // 'masterpitstop_id', pr.masterpitstop_id,
'masterpitstop_nama', mpit.nama, // 'masterpitstop_nama', mpit.nama,
'nilai', pr.nilai, // 'nilai', pr.nilai,
'action_at', pm.namalengkap, // 'action_at', pm.namalengkap,
'created_at', pr.created_at, // 'created_at', pr.created_at,
'type_karyawan', pr.tipe_karyawan // 'type_karyawan', pr.tipe_karyawan
) // )
ORDER BY NULLIF(pr.masterpitstop_id, '')::int // ORDER BY NULLIF(pr.masterpitstop_id, '')::int
) FILTER (WHERE pr.id IS NOT NULL), // ) FILTER (WHERE pr.id IS NOT NULL),
'[]'::json // '[]'::json
) as praakre_data // ) as praakre_data
FROM public.pegawai_luar_pl pl // FROM public.pegawai_luar_pl pl
JOIN public.pegawai_m pg // JOIN public.pegawai_m pg
ON similarity(LOWER(pl.nama), LOWER(pg.namalengkap)) > 0.6 // ON similarity(LOWER(pl.nama), LOWER(pg.namalengkap)) > 0.6
LEFT JOIN public.mappegawaijabatantounitkerja_m mp // LEFT JOIN public.mappegawaijabatantounitkerja_m mp
ON pg.id = mp.objectpegawaifk // ON pg.id = mp.objectpegawaifk
AND mp.statusenabled = true // AND mp.statusenabled = true
AND mp.isprimary = true // AND mp.isprimary = true
LEFT JOIN public.unitkerjapegawai_m ukp // LEFT JOIN public.unitkerjapegawai_m ukp
ON ukp.id = mp.objectunitkerjapegawaifk // ON ukp.id = mp.objectunitkerjapegawaifk
-- 🔥 PRAAKRE INTERNAL + LUAR // -- 🔥 PRAAKRE INTERNAL + LUAR
LEFT JOIN public.praakre pr // LEFT JOIN public.praakre pr
ON ( // ON (
(pr.tipe_karyawan = 'internal' AND pr.pegawai_id::int = pg.id) // (pr.tipe_karyawan = 'internal' AND pr.pegawai_id::int = pg.id)
OR // OR
(pr.tipe_karyawan = 'luar' AND pr.pegawai_id::int = pl.id) // (pr.tipe_karyawan = 'luar' AND pr.pegawai_id::int = pl.id)
) // )
LEFT JOIN public.masterpitstop mpit // LEFT JOIN public.masterpitstop mpit
ON mpit.id = NULLIF(pr.masterpitstop_id, '')::int // ON mpit.id = NULLIF(pr.masterpitstop_id, '')::int
LEFT JOIN public.pegawai_m pm // LEFT JOIN public.pegawai_m pm
ON pm.id = NULLIF(pr.action_at, '')::int // ON pm.id = NULLIF(pr.action_at, '')::int
WHERE // WHERE
pl.tipe ILIKE '%OUTSORCHING%' // pl.tipe ILIKE '%OUTSORCHING%'
AND pg.statusenabled = true // AND pg.statusenabled = true
AND pg.kategorypegawai = '11' // AND pg.kategorypegawai = '11'
AND pg.kedudukanfk = 1 // AND pg.kedudukanfk = 1
GROUP BY // GROUP BY
pl.nama, pl.tipe, pg.id, pg.namalengkap, ukp.name // pl.nama, pl.tipe, pg.id, pg.namalengkap, ukp.name
UNION ALL // UNION ALL
-- ========================= // -- =========================
-- 🔥 2. HANYA DI INTERNAL // -- 🔥 2. HANYA DI INTERNAL
-- ========================= // -- =========================
SELECT // SELECT
'-' AS nama_external, // '-' AS nama_external,
NULL AS tipe, // NULL AS tipe,
pg.id as pegawai_id, // pg.id as pegawai_id,
pg.namalengkap AS nama_internal, // pg.namalengkap AS nama_internal,
ukp.name AS unit, // ukp.name AS unit,
NULL as score, // NULL as score,
false as is_match, // false as is_match,
'HANYA DI INTERNAL' as status_data, // 'HANYA DI INTERNAL' as status_data,
COUNT(pr.id) as total_praakre, // COUNT(pr.id) as total_praakre,
COALESCE( // COALESCE(
json_agg( // json_agg(
json_build_object( // json_build_object(
'id', pr.id, // 'id', pr.id,
'masterpitstop_id', pr.masterpitstop_id, // 'masterpitstop_id', pr.masterpitstop_id,
'masterpitstop_nama', mpit.nama, // 'masterpitstop_nama', mpit.nama,
'nilai', pr.nilai, // 'nilai', pr.nilai,
'action_at', pm.namalengkap, // 'action_at', pm.namalengkap,
'created_at', pr.created_at, // 'created_at', pr.created_at,
'type_karyawan', pr.tipe_karyawan // 'type_karyawan', pr.tipe_karyawan
) // )
ORDER BY NULLIF(pr.masterpitstop_id, '')::int // ORDER BY NULLIF(pr.masterpitstop_id, '')::int
) FILTER (WHERE pr.id IS NOT NULL), // ) FILTER (WHERE pr.id IS NOT NULL),
'[]'::json // '[]'::json
) as praakre_data // ) as praakre_data
FROM public.pegawai_m pg // FROM public.pegawai_m pg
LEFT JOIN public.mappegawaijabatantounitkerja_m mp // LEFT JOIN public.mappegawaijabatantounitkerja_m mp
ON pg.id = mp.objectpegawaifk // ON pg.id = mp.objectpegawaifk
AND mp.statusenabled = true // AND mp.statusenabled = true
AND mp.isprimary = true // AND mp.isprimary = true
LEFT JOIN public.unitkerjapegawai_m ukp // LEFT JOIN public.unitkerjapegawai_m ukp
ON ukp.id = mp.objectunitkerjapegawaifk // ON ukp.id = mp.objectunitkerjapegawaifk
-- 🔥 PRAAKRE INTERNAL SAJA // -- 🔥 PRAAKRE INTERNAL SAJA
LEFT JOIN public.praakre pr // LEFT JOIN public.praakre pr
ON pr.tipe_karyawan = 'internal' // ON pr.tipe_karyawan = 'internal'
AND pr.pegawai_id::int = pg.id // AND pr.pegawai_id::int = pg.id
LEFT JOIN public.masterpitstop mpit // LEFT JOIN public.masterpitstop mpit
ON mpit.id = NULLIF(pr.masterpitstop_id, '')::int // ON mpit.id = NULLIF(pr.masterpitstop_id, '')::int
LEFT JOIN public.pegawai_m pm // LEFT JOIN public.pegawai_m pm
ON pm.id = NULLIF(pr.action_at, '')::int // ON pm.id = NULLIF(pr.action_at, '')::int
WHERE // WHERE
pg.statusenabled = true // pg.statusenabled = true
AND pg.kategorypegawai = '11' // AND pg.kategorypegawai = '11'
AND pg.kedudukanfk = 1 // AND pg.kedudukanfk = 1
AND NOT EXISTS ( // AND NOT EXISTS (
SELECT 1 FROM public.pegawai_luar_pl pl // SELECT 1 FROM public.pegawai_luar_pl pl
WHERE pl.tipe ILIKE '%OUTSORCHING%' // WHERE pl.tipe ILIKE '%OUTSORCHING%'
AND similarity(LOWER(pl.nama), LOWER(pg.namalengkap)) > 0.6 // AND similarity(LOWER(pl.nama), LOWER(pg.namalengkap)) > 0.6
) // )
GROUP BY // GROUP BY
pg.id, pg.namalengkap, ukp.name // pg.id, pg.namalengkap, ukp.name
ORDER BY status_data, nama_internal // ORDER BY status_data, nama_internal
"); // ");
// 🔥 FIX: pastikan JSON jadi array beneran di Laravel // // 🔥 FIX: pastikan JSON jadi array beneran di Laravel
$data = collect($data)->map(function($item){ // $data = collect($data)->map(function($item){
$item->praakre_data = is_string($item->praakre_data) // $item->praakre_data = is_string($item->praakre_data)
? json_decode($item->praakre_data, true) // ? json_decode($item->praakre_data, true)
: $item->praakre_data; // : $item->praakre_data;
return $item; // return $item;
}); // });
return [ // return [
'summary' => [ // 'summary' => [
'total' => $data->count(), // 'total' => $data->count(),
'match' => $data->where('status_data', 'MATCH')->count(), // 'match' => $data->where('status_data', 'MATCH')->count(),
'internal_only' => $data->where('status_data', 'HANYA DI INTERNAL')->count(), // 'internal_only' => $data->where('status_data', 'HANYA DI INTERNAL')->count(),
'total_lulus' => $data->sum('jumlah_lulus'), // 'total_lulus' => $data->sum('jumlah_lulus'),
'total_tidak_lulus' => $data->sum('jumlah_tidak_lulus'), // 'total_tidak_lulus' => $data->sum('jumlah_tidak_lulus'),
], // ],
'data' => $data // 'data' => $data
]; // ];
}); // });